使用 nockjs 和 jest 进行Promise/异步单元测试的代码覆盖问题

IT技术 javascript reactjs jestjs code-coverage nock
2021-04-28 03:38:37

我使用 NockJS 和 Jest 为react应用程序编写了一个简单的 API 调用单元测试,如下所示:

AjaxService.js

export const AjaxService = {
    post: (url, data, headers) => {
        return axios({
            method: "POST",
            url: url,
            headers: headers || { "content-type": "application/json" },
            data: data
        });
    },
};

APIPromise:

export const getDashboard = (request) => {
  return AjaxService.post(API_DASHBOARD_URL + "/getDashboard", request
  ).then(
    response => {
      return response.data;
    },
    (error) => {
      return error.response.data;
    }
  )
};

使用 NockJS 进行单元测试:

nock(baseUrl)
    .post(subUrl, request)
    .reply(200, response);

getDashboard(request)
    .then(resp => {
        let compareVal = getNestedObject(resp, keyToCompare);
        let actualVal = getNestedObject(response, keyToCompare);
        expect(compareVal).to.equal(actualVal);
    })
    .then(() => {});

但是当使用 Jest 生成代码覆盖率报告时--coverage,如下所示:

在此处输入图片说明

我们可以看到,在promise中,单元测试时没有调用成功回调错误回调当应用程序有大量 API 调用时,如何覆盖这部分代码,因为它会影响代码覆盖率?还是我没有测试正确?请帮助,因为我是单元测试的新手。提前致谢。

1个回答

Jest仅当它在测试期间运行时才将其计为已覆盖

在这种情况下,您似乎getDashboard在测试期间正在调用...

...但是getDashboard是异步的,测试不会等待它完成。

这意味着测试在异步代码getDashboard有机会运行之前同步完成,并且任何尚未运行的Jest代码都不包含在代码覆盖范围内。

为了确保代码正确的测试,并包含在代码覆盖率确保您awaitPromise用返回getDashboard

test('getDashboard', async () => {  // <= async test function
  nock(baseUrl)
    .post(subUrl, request)
    .reply(200, response);

  await getDashboard(request)  // <= await the Promise
    .then(resp => {
      let compareVal = getNestedObject(resp, keyToCompare);
      let actualVal = getNestedObject(response, keyToCompare);
      expect(compareVal).to.equal(actualVal);
    })
})