Das Testen von postMessage mit Jasmine async funktioniert nicht

8

Ich versuche Jasmine 2.0 zu verwenden, um Komponententests für eine bestimmte Logik in einer AngularJS-App zu schreiben, aber die Logik befindet sich in einem Ereignis-Listener. Von der Steuerung:

%Vor%

Und aus der Testdatei:

%Vor%

Aber der Test schlägt fehl, der Spion wird nie getroffen. Zusätzliche Informationen von Console Debug-Anweisungen:

  • window.addEventListener im Controller wird aufgerufen.
  • Die Blöcke beforeEach und it werden beide aufgerufen.
  • Der obige Nachrichtenhandler im Controller wird während des Tests nicht aufgerufen.
  • Die Nachricht, die in diesem Test gesendet wird, wird schließlich vom Nachrichtenhandler mehrmals empfangen, aber nicht vor dem Ende des Tests.

Was fehlt mir hier?

    
Alan Gordon 11.06.2015, 18:12
quelle

1 Antwort

6

Es passiert, weil du in deinem beforeEach -Block window.postMessage() aufruft (was asynchron ist und du nicht weißt, wann es ausgeführt wird) und dann done() direkt danach aufruft, als wäre es synchroner Code. Aber window.postMessage() als async, und im Grunde müssen Sie done() aufrufen, wenn Ihre asynchrone Operation abgeschlossen ist. Es könnte so gemacht werden:

%Vor%

Wenn Ihr Spion ausgeführt wird, wird die asynchrone Operation als abgeschlossen betrachtet.

Dies könnte noch kürzer ausgedrückt werden:

%Vor%

Hier ist der vollständige Code:

%Vor%

Sehen Sie sich einen funktionierenden JS-Bin an: Ссылка

Ich habe in dieser Probe kein Angular verwendet, da es mit einem reinen JS reproduzierbar ist.

    
Michael Radionov 14.07.2015, 08:55
quelle