Правильный способ сделать асинхронные вызовы, чтобы получить тестовые данные из конечных точек REST внутри транспортира? - PullRequest
0 голосов
/ 18 января 2019

Мы проводим сквозное тестирование пользовательского интерфейса, используя Protractor и используя Jasmine в качестве среды BDD. Нам нужно, чтобы текст пользовательского интерфейса был проверен по данным из REST API, для которых мы используем Axios !! Это правильный подход? Пример кода указан ниже:

import axios from "axios";

describe("Some test for ", () => {

beforeEach(function(done) {
  axios
    .get(
     "******************"
    )
    .then(response => {
      data_file = response.data;
      done();
    });
});

it("some spec ", done => {
  expect($('#someId').getText()).toBe(data_file.someData);
  done();
});

});

Можем ли мы использовать Chakram вместо Axios внутри Jasmine в Protractor для получения данных?

Если вышеприведенные подходы неверны, то каков правильный способ тестирования пользовательского интерфейса с данными из конечных точек REST? (Чай + мокко + чакрам + транспортир) или еще что-нибудь?

1 Ответ

0 голосов
/ 20 января 2019

Это может быть. Обратный вызов done() сообщает Jasmine, что вы выполняете асинхронную задачу; Тем не менее, вы должны быть осторожны, чтобы поймать ошибки.

Добавление в done.fail

import axios from "axios";

describe("Some test for ", () => {

  beforeEach(function(done) {
    axios
      .get(
       "******************"
      )
      .then(response => {
        data_file = response.data;
        done();
      })
      // if the above fails to .get, then we should catch here and fail with a message
      .catch(error => {
        done.fail('axios.get failed to execute');
      });
  });

Лучший подход. Использование async / await

В вашей конфигурации Protractor вам нужно будет добавить SELENIUM_PROMISE_MANAGER: false, чтобы включить асинхронное / ожидание. Теперь вам потребуется дождаться всех обещаний.

import axios from "axios";

describe("Some test for ", () => {

  beforeEach(async () => {
    try {
      const data_file = await axios.get("******************").data;
    } catch (e) {
      console.error('axios.get failed to execute');
      throw e;  // throwing errors should fail the spec.
    }
  });

  it("some spec ", async () => {
    // .getText returns a Promise<string> so you'll need to await it
    // to get the string value.
    expect(await $('#someId').getText()).toBe(data_file.someData);
  });  
});
...