Javascript 使用nockjs和jest进行promise/asynchronous单元测试时的代码覆盖率问题
我使用NockJS和Jest为react应用程序编写了一个简单的API调用单元测试,如下所示: AjaxService.jsJavascript 使用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
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
。请参阅