[英]Promise swallows mocha/chai assertion
我的项目中有一个功能,可以一个接一个地发送一堆电子邮件。 因此,我将这些列表编译成一个Promise.all(...)
数组,并使用Promise.all(...)
将它们全部发送出去,然后在此之后结束函数。 但是,我将对此进行测试,似乎Promise似乎正在“吞噬”我的错误。 这是我的代码片段:
module.exports.checkForLoanEmailAndSendAll = function(next) {
// Some setup code
var emailPromises = [];
Object.keys(userLoanMap).forEach(function(user) {
emailPromises.push(new Promise((resolve, reject) => {
sendSingleLoanEmail(user, userLoanMap[user], loanEmailObj, function(error) {
if (error) {
reject(error);
} else {
resolve();
}
});
}));
});
Promise.all(emailPromises).then(function() {
next();
}, function(error) {
next(error);
});
}
在这种情况next
, next
只是一个标准回调,如果有错误,则返回错误,否则返回null。 在我的测试中,我有以下代码(该代码称为上一个代码段)
it('sends loan emails to appropriate users if there is a email to send today', (done) => {
Emailer.checkForLoanEmailAndSendAll(function(error) {
should.not.exist(error);
var sentMail = nodemailerMock.mock.sentMail();
sentMail.length.should.be.eql(2);
// more should assertions
done();
});
});
例如,如果sentMail.length.should.be.eql(2);
会发生什么? 失败,则将导致UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError:
而不是被摩卡咖啡正常处理并导致测试失败。
如何获得Promise不会吞下此错误并让Mocha处理该错误?
这是您面临的直接问题。 事件的顺序是:
Promise.all(emailPromises)
解析,所以它要求你传递给成功回调.then
。
next()
被调用。
sentMail.length.should.be.eql(2);
失败,这将引发异常。
因为异常发生在.then
处理程序中,所以它被等同于诺言拒绝。
从这一点开始,没有什么可以处理拒绝的。 你有这个:
Promise.all(emailPromises).then(function() {
next();
}, function(error) {
next(error);
});
但是您应该注意,当您调用.then(success, failure)
, failure
处理程序将捕获在调用success
之前发生的所有事情。 如果success
本身失败了,那么failure
将不会被称为 。
作为最小的更改,您可以将其重写为:
Promise.all(emailPromises).then(function() {
next();
}).catch(function(error) {
next(error);
});
这将捕获.then
处理程序调用next
时发生的任何错误。
但是,最终,我将重写整个内容,以便它始终使用promise。 然后,您可以等待Mocha测试中的承诺,然后将其返回给Mocha。 总体来说会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.