内部异步函数的异步测试应该失败
Posted
技术标签:
【中文标题】内部异步函数的异步测试应该失败【英文标题】:Async test with inner async function should fail 【发布时间】:2018-04-06 20:26:42 【问题描述】:在我的 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
处理程序,但测试仍然通过)
【问题讨论】:
在这里查看主题:***.com/questions/14879181/… @MihaiAndrici,我没有提到它以保持问题和代码简短,但在原始代码中它实际上不是throw
,而是一个失败的 Chai 断言。结果是一样的(expect.fail()
不会导致测试失败)。不过还是谢谢。
【参考方案1】:
.forEach
的测试用例无法像您希望的那样工作。当它调用它的异步回调时,回调确实会创建一个 Promise,但 .forEach
不会对它做任何事情。您传递给it
的回调也是异步的,它确实返回了一个promise,但它返回的promise 与.forEach
的回调产生的promise 没有关联。这就是你得到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
可以使您的数组变成一个promise 数组,然后Promise.all
等待数组中的所有promise 被解析,或者如果任何promise 被拒绝,它就会拒绝。返回 Promise.all
调用的返回值,然后让 Mocha 等待整个过程。
【讨论】:
【参考方案2】:路易斯的回答很到位。作为替代方案,您可以避免使用内部函数,而是使用普通的 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');
【讨论】:
以上是关于内部异步函数的异步测试应该失败的主要内容,如果未能解决你的问题,请参考以下文章