正确的方法来进行异步调用以从Protractor内部的REST端点获取测试数据?

时间:2019-01-18 07:29:56

标签: javascript jasmine protractor mocha chakram

我们正在使用Protractor并使用Jasmine作为BDD框架进行端到端UI测试。我们需要针对REST API中的数据验证UI文本,为此我们正在使用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();
});

});

我们可以在量角器的Jasmine中使用Chakram代替Axios来获取数据吗?

如果上述方法错误,那么针对REST端点数据测试UI的正确方法是什么? (柴+摩卡+查克拉姆+量角器)还是其他?

1 个答案:

答案 0 :(得分:1)

可能是。 done()回调告诉Jasmine您正在执行异步任务;但是,您应该小心捕捉错误。

添加完成。失败

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');
      });
  });

更好的方法。使用异步/等待

在量角器配置中,您需要添加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);
  });  
});