Wir versuchen derzeit, unsere eckigen Dienste zu testen, die versprechen, Werte an die Controller zurückzugeben. Das Problem ist, dass die Funktionen, die wir an die .then binden, nicht in Jasmine aufgerufen werden.
Wir haben festgestellt, dass das Hinzufügen von $ rootScope.digest () zur Funktion nach der Rückgabe des Versprechens synchrone Versprechungen zulässt, aber es funktioniert immer noch nicht für Asynchrone Versprechen.
Der Code ist bisher
%Vor%In diesem Fall wird die Verheißung als gut bezeichnet, aber wenn sie asynchron ist, wird sie nicht aufgerufen, weil die Verheißung nicht bereit ist für die "Verdauung" zu dem Zeitpunkt, zu dem die Wurzel. $ digest () aufgerufen wird.
Gibt es eine Möglichkeit zu sagen, wann eine Zusage nach der Auflösung ist, damit ich Digest aufrufen kann? Oder vielleicht etwas, das das automatisch machen würde? Danke;)
Teilweise des Dienstes, den wir testen müssen (Fehlerbehandlung entfernt):
%Vor%Wenn es ein Problem gibt, wenn service.getData async ist, wird das Versprechen aufgelöst, aber die Funktion, die dem Testcode aus dem Testcode beigefügt ist, wird nicht aufgerufen, weil der Stamm. $ digest bereits aufgerufen wurde. Hoffe das gibt mehr Info
Workaround
%Vor%Am Ende nutzte ich die obige Problemumgehung, um den Digest wiederholt aufzurufen, so dass jede Versprechensschicht eine Chance bekommen würde, ausgeführt zu werden ... es ist nicht ideal oder hübsch, aber es funktioniert für den Test ...
Sie sollten Ihre Behauptungen außerhalb des dann glaube ich bewegen:
%Vor%Aktualisieren
Verzweifelte den Plunkr aus dem Kommentar unten, um zu zeigen, wie man einen asynchronen Anruf testen kann.
>Dem Dienst wurde ein $ timeout hinzugefügt:
%Vor%Und ich spüle das $ Timeout vor dem Bestätigen:
%Vor%Tags und Links javascript angularjs jasmine angular-promise