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. beforeEach
und it
werden beide aufgerufen. Was fehlt mir hier?
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:
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.
Tags und Links javascript angularjs unit-testing jasmine postmessage