测试异步异步等待JavaScript函数

时间:2017-10-15 19:58:18

标签: javascript reactjs asynchronous async-await nock

我编写了一个异步JavaScript函数,但似乎没有得到我期望的返回值。有人可以解释我是否误解了异步功能的工作方式,或者我的测试是不是很正确?

以下是我的测试,使用Nock嘲笑服务。

it('Should call async validation function when button is clicked', () => {
    const request = nock(/.*/)
      .get('/my-service/logincodes/abc123')
      .reply(404);

    const comp = mount(
      <LoginCodeView />
    );
    expect(comp.instance().doesLoginCodeExist('abc123')).to.equal('Your Login code is not recognized.');
 });

正在测试的功能:

  doesLoginCodeExist = async (loginCode) => {
    if (loginCode.match(loginPattern)) {
      const response = await MyService.getUserByLoginCode(loginCode);

      if (response.code) {
        return {};
      } else if (response.status === 404) {
        return { error: 'Your login code is not recognized.', success: null };
      }
      return { error: 'Service is temporarily unavailable.', success: null };
    }
    return null;
  };

我已经注销了代码所采用的路径,并且看起来似乎是按照预期进入了else if,但是我总是返回一个空对象{},而不是具有错误和成功属性的对象预期?

2 个答案:

答案 0 :(得分:2)

async函数始终返回Promise个对象。我怀疑这就是你所说的空对象。

作为解决方案,您可以尝试制作测试函数async并使用await。然后,您可以测试promise所解析的值。

答案 1 :(得分:2)

让我的测试异步等待解决了这个问题。

it('Should call async validation function when button is clicked', async () => {
    const request = nock(/.*/)
      .get('/my-service/logincodes/abc123')
      .reply(404);

    const comp = mount(
      <LoginCodeView />
    );
    const returned = await comp.instance().doesLoginCodeExist('abc123')
    expect(returned.error).to.equal('Your Login code is not recognized.');
 });