2016-04-26 29 views
1

Ich habe einige Stellen in Komponententests gesehen, in denen eine Funktion eine q.allSettled() Zusage von einem Funktionsaufruf zurückgibt, und es gibt ein .fail, das dem Versprechen beigefügt ist. Aber .allSettled wird .then aufrufen, auch wenn einige/alle Versprechen abgelehnt werden.Schlägt Q.allSettled jemals fehl?

Hier ist ein Beispiel:

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); 
     }); 
}); 

Können Sie einige Beispiele geben, wo .fail ausgelöst werden würde?

+0

Ich hatte keinen Blick auf die Quelle, aber es ist vorstellbar, dass es fehlschlägt, wenn Sie nicht in einem Array/iterable oder so etwas übergeben. – Bergi

+0

@Bergi, nein es ruft nur '.then' mit einem leeren Array – Shanimal

Antwort

2

Q.allSettled kann nicht fehlschlagen. Siehe Q API die sagt

ein Versprechen zurück, die mit einer Reihe von Versprechen Zustand Schnappschüsse erfüllt, aber erst, nachdem alle ursprünglichen Versprechungen niedergelassen haben, das heißt geworden entweder erfüllt oder abgelehnt wird.

Dies ist ziemlich klar, dass was auch immer verspricht in allSettled werden Sie immer noch ein gelöstes Versprechen bekommen.

In Ihrem speziellen Fall kann die .then Anweisung aufgrund der z. folgende Zeile

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

Dies kann eine Assertion Ausnahme auslösen, die zum scheitern führen wird, und Sie können es fangen und done(); laufen, die den Weg zum Test-Tool zu sagen ist, die asynchrone Anforderung abgeschlossen wurde. Aber das ist nur eine Vermutung. Q.allSettled selbst kann nicht fehlschlagen.

+0

Also, um zu wiederholen, was Sie sagen,' .allSettled' selbst nicht fehlschlägt, aber wenn etwas in '.then dann eine unbehandelte Ausnahme dann wirft '.fail' wird ausgelöst. – Shanimal

+0

@Shanimal genau – smnbbrv