我已经在单元测试中看到了一些函数,函数在函数调用中返回q.allSettled()
承诺,并且附加了承诺的.fail
。但即使某些/所有承诺被拒绝,.allSettled
也会调用.then
。
以下是一个例子:
function someFunctionToTest(){
var aRejectedDeferred = Q.defer();
var anotherRejectedDeferred = Q.defer();
var aResolvedDeferred = Q.defer();
aRejectedDeferred.reject(new Error("I'm aRejectedPromise"));
anotherRejectedDeferred.reject(new Error("I'm anotherRejectedPromise"));
aResolvedDeferred.resolve({awesome:"I'm aResolvedPromise"});
return Q.allSettled([aRejectedDeferred.promise,anotherRejectedDeferred.promise, aResolvedDeferred.promise])
}
it('should never fail', function(done) {
someFunctionToTest()
.then(function (data) {
should.equal(data[0].state,'rejected');
should.equal(data[1].state,'rejected');
should.equal(data[2].state,'fulfilled');
// throw(new Error('I will trigger fail!!!'));
done();
})
.fail(function (err) {
done(err);
});
});
您能提供一些可以触发.fail
的示例吗?
答案 0 :(得分:5)
Q.allSettled
不能失败。请参阅Q API,其中包含
返回使用promise状态数组实现的promise 快照,但只有在所有原始承诺已经解决之后,即 成就或被拒绝。
很明显,allSettled
中的任何承诺都会得到解决的承诺。
在您的特定情况下,.then
语句可能会失败,例如以下一行
should.equal(data[0].state,'rejected');
这可能抛出一个断言异常,导致失败,你可以捕获它并运行done();
,这是对测试工具说异步请求已经完成的方式。但这只是猜测。 Q.allSettled
本身不会失败。
答案 1 :(得分:0)
您可能要考虑两件事:
Q.allSettled
没有fail
函数,它仅与以承诺状态作为参数的done()
一起使用。您应该检查这些状态以查看诺言是fulfilled
还是rejected
。但是Q.all
有一个then
和一个fail
函数,您可能想使用,但不会将任何参数传递给then
,因此不会知道任何状态。fail()
函数),则状态将始终为fullfiled
,因此在使用Q.all
或Q.allSettled
,要么不捕获承诺中的错误,要么在捕获后再次抛出它们!