2016-04-26 18 views
1

ユニットテストでは、ある関数が関数呼び出しから約束したq.allSettled()を返し、その約束に.failが付いています。しかし、.allSettledは、いくつかの/すべての約束が拒否されても.thenを呼び出すでしょう。ここでQ.allSettledはこれまでに失敗しますか?

は例です:

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

私はソースを見ていませんでしたが、配列/ iterableなどを渡さなければ失敗すると思います。 – Bergi

+0

@Bergi、いいえ、空の配列で '.then'を呼び出すだけです。 – Shanimal

答えて

2

Q.allSettledは失敗できません。

が約束状態の配列 スナップショットで満たされている約束を返しますが、すべてオリジナルの約束が落ち着いた後にのみ、すなわち はどちらかになる成就または拒否言うどのQ APIを参照してください。

allSettledで約束されていることは、依然として解決済みの約束を得られることは明らかです。

特定のケースでは、.thenステートメントが失敗する可能性があります。ライン

should.equal(data[0].state,'rejected'); 

次これは失敗につながるアサーション例外をスローすることが、あなたはそれをキャッチし、非同期要求が終了したテストツールに言うための方法であるdone();を実行することができます。しかし、これはちょうど推測です。 Q.allSettled自体は失敗できません。

+0

あなたが言っていることを繰り返し述べると、' .allSettled'自体は失敗しませんが、 '.then'の中に何かが未処理の例外'.fail'が起動します。 – Shanimal

+0

@Shanimal exactly – smnbbrv

関連する問題