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
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);
})
})
我已经为 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
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);
})
})