Wie unit-Tests eine angularjs Versprechen Kette mit $httpBackend
Verwendung von AngularJS, ich bin versucht, unit-test-eine Funktion, die mehrere Aufrufe von $http.
Mein test sieht wie folgt aus:
it('traverses over a hierarchical structure over multiple chained calls', function() {
myService.traverseTheStuff()
.then(function(theAggregateResult) {
//...is never fulfilled
});
$httpBackend.flush();
});
Andere single-call-tests registriert den callback übergeben .dann (), und führen Sie es, sobald ich rufe .flush().
Den code unter test so aussieht.
function traverseTheStuff(){
//This will make a call to $http to fetch some data
return getRootData()
//It is fulfilled at the end of the test when I $httpBackend.flush()
.then(function(rootData){
//Another call to $http happens AFTER $httpBackend.flush()
return getNextLevel(rootData.someReference);
})
//The second promise is never fulfilled and the test fails
.then(function(nextLevel){
return aggregateTheStuff(...);
});
}
Für das, was Ihren Wert, jedes einzelne Aufrufe: Einheit separat getestet. Ich möchte hier durchqueren Sie ein Baum -, Aggregat-einige Daten und unit-testen, a) dass die Versprechen, die die Verkettung richtig angeschlossen ist und b) die aggregation ist richtig. Abflachung es aus in separate diskrete Anrufe ist bereits getan.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein Anfänger in der Prüfung Eckig, aber ich habe setup eine plnkr, dass die tests ein sehr ähnliches setup, um Ihnen mit einem erfolgreichen "zweiten" dann/Versprechen nennen
http://plnkr.co/edit/kcgWTsawJ36gFzD3CbcW?p=preview
Den untenstehenden code-Schnipsel sind etwas vereinfachte Versionen der oben genannten plnkr.
Die wichtigsten Punkte, die ich gefunden habe sind
I Hinweis die Funktion traverseTheStuff nicht nennen $http/$httpBackend überhaupt. Es nutzt nur Funktionen definiert, die im $q verspricht, so dass die Tests auf geht von $q, und injiziert, die
Die Funktionen asynchron aufgerufen werden ausspioniert/Stubs mit Ihren Versprechen, die Werte zurückgeben, wo die Verheißung in der test selbst, also der tatsächlichen Umsetzung nicht aufgerufen, wenn die Prüfung traverseTheStuff
Gibt es keine Aufrufe "dann" in der Prüfung, nur zu "beheben", auf die Verheißungen, erstellt im test, gefolgt von $rootScope.$apply(), um dann tatsächlich nennen, der "dann" - Rückrufe in traverseTheStuff, welches wir auch testen werden genannt
Jedes Versprechen muss aufgelöst werden/$apply-ed aufrufen, den nächsten "dann" - Funktion in der Kette. So. um den test zu call aggregateTheStuff (oder besser gesagt, seine stub), das zweite Versprechen, zurück aus dem getNextLevel stub, muss auch gelöst werden:
Ein Problem mit allen der oben genannten, ist, dass es meint bestimmte Verhaltensweisen von $q und $rootScope. Ich war unter dem Verständnis der unit-tests wie diesem sollte dies nicht Annahmen, um wirklich nur testen, ein bisschen code. Ich habe nicht herausgefunden, wie man das umgehen kann, oder wenn ich bin Missverständnis.