Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用nockjs和jest进行promise/asynchronous单元测试时的代码覆盖率问题_Javascript_Reactjs_Jestjs_Code Coverage_Nock - Fatal编程技术网

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

Javascript 使用nockjs和jest进行promise/asynchronous单元测试时的代码覆盖率问题,javascript,reactjs,jestjs,code-coverage,nock,Javascript,Reactjs,Jestjs,Code Coverage,Nock,我使用NockJS和Jest为react应用程序编写了一个简单的API调用单元测试,如下所示: AjaxService.js export const AjaxService = { post: (url, data, headers) => { return axios({ method: "POST", url: url, headers: headers || { "content-typ

我使用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
        });
    },
};
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
仅当一行在测试期间运行时才将其计算为覆盖

在本例中,看起来您正在测试期间调用
getDashboard

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

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

为确保代码已正确测试并包含在代码覆盖范围内,请确保您等待
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);
    })
})

test('getDashboard',async()=>{//只是确认一下,传递给nock的
baseUrl
值是相同的
API_DASHBOARD_URL
正确吗?我想确保你模拟的是应用程序的出站请求,而不是应用程序的入站请求。是的!。baseUrl和API_DASHBOARD_URL是相同的。什么是
AjaxService
?你有没有试着搞乱应用程序您的成功回调的内容以查看测试是否仍然通过?AjaxService将返回axios实例。没有。我没有尝试更改回调的任何内容。我已更新了问题。请检查。或者您可以
返回
(而不是
等待
测试中的
承诺
,以防回调写为
async
。请参阅