在我的mocha.js测试中,我正在调用一个抛出错误的async
函数,但测试不会失败。它通过并有一个UnhandledPromiseRejectionWarning
:
describe('async function', async function () {
it('should fail', async function () {
[1].forEach(async function () {
throw new Error("Why can't I see this error?!");
});
});
});
请注意,更简单的情况可以按预期工作:
describe('async function', async function () {
it('should fail', async function () {
throw new Error('This one fails the test');
});
});
如何导致测试因内部函数中的异常而失败?
(我尝试添加unhandledRejection
处理程序,但测试仍然通过)
答案 0 :(得分:3)
.forEach
的测试用例无法像您希望的那样工作。当它调用异步回调时,回调会创建一个承诺,但.forEach
不会对它做任何事情。您传递给it
的回调也是异步的,它确实返回一个承诺,但它返回的承诺与.forEach
回调产生的承诺没有关联。这就是你获得UnhandledPromiseRejectionWarning
的原因。
您可以通过Promise.all
:
describe('async function', async function () {
it('should fail', async function () {
return Promise.all([1].map(async function () {
throw new Error("Why can't I see this error?!");
}));
});
});
使用map
使得你的数组变成一个promises数组,然后Promise.all
等待数组中的所有promises被解析,或者如果有任何promise拒绝则拒绝。返回Promise.all
调用的返回值,然后允许Mocha等待整个事情。
答案 1 :(得分:3)
路易斯的回答是现实的。作为替代方案,您可以避免使用内部函数并改为使用普通的for
循环:
const data = [1];
for (let i = 0; i < data.length; i++) {
// await some more stuff here
throw new Error('This one fails the test');
}