使用内部异步函数的异步测试应该失败
Async test with inner async function should fail
在我的 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
处理程序,但测试仍然通过)
您的 .forEach
测试用例无法像您希望的那样工作。当它调用它的异步回调时,回调确实创建了一个承诺,但是 .forEach
没有对它做任何事情。您传递给 it
的回调也是异步的,它执行 return 一个承诺,但是 returns 的承诺与 .forEach
的回调产生的承诺无关.这就是为什么你得到 UnhandledPromiseRejectionWarning
.
您可以通过 Promise.all
:
连接 promise 来解决问题
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
调用的 return 值,然后让 Mocha 等待整个过程。
Louis 的回答很正确。作为替代方案,您可以避免使用内部函数,而是使用普通的 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');
}
在我的 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
处理程序,但测试仍然通过)
您的 .forEach
测试用例无法像您希望的那样工作。当它调用它的异步回调时,回调确实创建了一个承诺,但是 .forEach
没有对它做任何事情。您传递给 it
的回调也是异步的,它执行 return 一个承诺,但是 returns 的承诺与 .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
调用的 return 值,然后让 Mocha 等待整个过程。
Louis 的回答很正确。作为替代方案,您可以避免使用内部函数,而是使用普通的 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');
}