Unit-Test angularjs $ q.all - Versprechen wird nie abgeschlossen

8

Ich versuche einen Dienst zu testen, den ich benutze, der Angulars $ q Implementierung von verwendet Versprechen. Ich verwende eine Kombination aus Karma, Mocha, Chai, Sinon, Sinon Chai und Chai als Versprechen.

Alle Tests, die ich geschrieben habe und die Versprechungen zurückgeben, werden weitergegeben, aber diejenigen, die $q.all([ ... ]) ablehnen oder verwenden. Ich habe alles versucht, was mir einfiel, aber ich kann nicht finden, wo das Problem liegt.

Das Folgende ist eine schlanke Version dessen, was ich gerade teste:

%Vor%

Der dritte, der letzte und der erste Test sind diejenigen, die scheitern. Eigentlich versagt es nicht, es löst sich nur, nachdem das Timeout überschritten wurde und ich bekomme Error: timeout of 2000ms exceeded .

BEARBEITEN : Ich habe gerade versucht, Kris 'Kowals Umsetzung der Versprechen zu testen und mit zu testen es funktioniert gut damit.

PS Ich habe tatsächlich festgestellt, dass irgendwo in den Schalen von Mocha, Chai oder Chai As Promise etwas Zeit verbracht wird und der afterEach hook später als das Timeout aufgerufen wird / em>

    
Roland 05.11.2014, 07:33
quelle

2 Antworten

3

Ich habe versucht herauszufinden, warum die Tests nicht bestanden werden, obwohl sie auf den ersten Blick so aussehen sollten. Natürlich müsste ich die $scope.$apply(); von afterEach verschieben, da dies nicht der Ort ist, an dem @proloser aufgerufen wird.

Obwohl ich das getan habe, sind die Tests immer noch nicht bestanden. Ich habe auch Probleme auf Chai-as-Versprochen und > eckig um zu sehen, ob ich irgendwelche Inputs / Feedbacks bekomme und mir wurde gesagt, dass es höchstwahrscheinlich nicht funktionieren wird. Der Grund liegt wahrscheinlich an der Abhängigkeit von Angular $q von der Digest-Phase, die in der Chai-as-promsied-Bibliothek nicht berücksichtigt wird.

Deshalb habe ich die Tests mit Q anstelle von $ q und es funktionierte gut und stärkte damit meine Hypothese, dass der Fehler nicht in der chai-as-sure-Bibliothek lag.

Ich habe Chai-as-Versprochen fallen gelassen und habe meinen Test mit Mochas done Callback neu geschrieben (obwohl hinter den Kulissen chai-as-promise das gleiche macht):

%Vor%

Die obigen Tests werden alle wie erwartet bestanden. Es könnte andere Wege geben, es zu tun, aber ich könnte nicht herausfinden, wie sonst, also wenn es jemand anderes tut, wäre es großartig, es gepostet zu haben, damit andere davon profitieren können.

    
Roland 14.11.2014, 08:13
quelle
13

afterEach() wird für die Bereinigung verwendet, nicht für die Ausführung von Code nach Ihren Vorbereitungen, aber vor Ihren Tests. $scope.$apply() wird auch nicht bereinigt.

Sie müssen Folgendes tun:

%Vor%

Du machst einen $apply() nachdem deine Tests gemacht wurden, nicht zwischen Setup und Auswertung.

    
ProLoser 09.11.2014 07:30
quelle