我已经在单元测试中看到了一些函数,其中函数从函数调用返回q.allSettled()
承诺,并且有一个附加到promise的.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
的例子吗?
Q.allSettled
不能失败。见Q API说
返回使用一组承诺状态快照实现的承诺,但仅在所有原始承诺已经解决后,即变为满足或拒绝。
很明显,无论allSettled
的任何承诺,你仍然会得到一个解决的承诺。
在您的特定情况下,.then
声明可能会失败,因为例如以下行
should.equal(data[0].state,'rejected');
这可能会抛出一个断言异常,导致失败,你可以捕获它并运行done();
,这是对测试工具说异步请求已经完成的方式。但这只是猜测。 Q.allSettled
本身不能失败。