promise/asynchronous 使用 nockjs 和 jest 进行单元测试的代码覆盖问题

Code coverage concern on promise/asynchronous unit testing using nockjs and jest

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

AjaxService.js

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

API承诺:

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 调用时,如何覆盖这部分代码,因为它会影响代码覆盖率?还是我没有测试正确?请帮忙,因为我是单元测试的新手。提前致谢。

Jest 仅当它 运行s 在测试期间 .

才算作被覆盖的行

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

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

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

为确保代码经过正确测试并包含在代码覆盖率中,请确保 await PromisegetDashboard:

返回
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);
    })
})