【问题标题】:Code coverage concern on promise/asynchronous unit testing using nockjs and jest关于使用 nockjs 和 jest 进行承诺/异步单元测试的代码覆盖率问题
【发布时间】:2019-08-26 10:54:26
【问题描述】:

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

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

【问题讨论】:

  • 只是为了确认,传递给 nock 的 baseUrl 值是相同的 API_DASHBOARD_URL 对吗?我想确保您模拟的是来自应用的出站请求,而不是应用的入站请求。
  • 是的! BaseUrl 和 API_DASHBOARD_URL 是一样的。
  • 什么是AjaxService?您是否尝试过弄乱成功回调的内容以查看测试是否仍然通过?
  • AjaxService 将返回 axios 实例。不,我没有尝试更改回调的任何内容。我已经更新了问题。请检查。

标签: javascript reactjs jestjs code-coverage nock


【解决方案1】:

Jest 仅在 在测试期间运行时才将一行视为已覆盖。

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

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

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

为确保代码经过正确测试并包含在代码覆盖范围内,请确保您 await Promise 返回 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);
    })
})

【讨论】:

  • 或者你可以在testreturn(而不是awaitPromise,以防回调不写为async。见this example
猜你喜欢
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2016-05-04
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多