2017-09-04 5 views
0

Ich muss einen internen Angular Service testen, der unter Angular 1.5.9 mit Jasmine/Karma implementiert wurde.

Ich muss einen Test schreiben, der überprüft, dass die Antwort einer bestimmten Dienstfunktion wie erwartet ist. Dazu konstruiere ich ein Mock-Objekt, instanziiere den Service, rufe die zu testende Funktion auf und benutze expect().toBe(), um den zurückgegebenen Wert zu überprüfen.

Leider ruft der Dienst zahlreiche Anrufe zu seinen eigenen Funktionen ab, von denen viele weitere Anrufe unter Verwendung des $http Winkeldienstes tätigen. Dies geschieht, um Objekte wie Benutzerdaten, Gebietsschema und andere maßgeschneiderte Produktinformationen zu füllen. Es genügt zu sagen, dass ich nicht in der Lage bin, den Dienst in eine bessere Architektur umzuformen; Ich muss diesen Test einfach konstruieren.

Da gibt es so viele Anrufe $http Ich beabsichtige, alle Daten verspotten würde es mit einer Reihe von Zeilen wie diese Anfrage:

var mockGetCartData = { "d": null, "message": null }; // at the top of the describe 
$httpBackend.when('GET', /(.*)\/order\/api\/v1\/GetCart/).respond(200, mockGetCartData); // in the beforeEach 

Wenn ich die Funktion aufrufen ich sofort getestet werden, nenne $httpBackend.flush() aber, als der Test fehlschlägt, bin ich besorgt, dass was ich tun muss, dass jeder (gefälschte) $http Anruf gelöscht wird, bevor der nächste gemacht wird.

Muss ich dies tun oder alle $httpBackend.when().respond() Einträge einrichten, auf die Testfunktion einwirken und dann einen einzelnen flush() genug aufrufen? Wenn das nicht genug ist, was soll ich tun?

Antwort

1

Sie müssen flush() nicht für jede Anforderung aufrufen, da alle ausstehenden Anforderungen gelöscht werden.

Siehe Dokumentation: https://docs.angularjs.org/api/ngMock/service/$httpBackend

oder Quelle: https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1830

Wenn jedoch die $http Anforderungen in der Methode im Test miteinander verkettet werden (so nachfolgende Anfragen nach dem vorherigen Antrag nur gestellt werden ist gelöst) dann müssen Sie flush() für jede Anfrage in der Kette. Ohne den getesteten Code zu sehen, kann ich Ihnen helfen.

0

Sie müssen den einzigen erforderlichen HTTP-Aufruf in Es spotten und es nach dem Funktionsaufruf spülen. Andernfalls wird versucht, unerwartete HTTP-Aufrufe zu löschen, die zu einem Fehler führen.

Verwandte Themen