Winkel - + Karma: das Testen von asynchronen Funktionen

Ich habe ein eckiges service, tut etwas async-Zeug (basierend auf den Timer). Eines der Dinge, die Sie tun können, mit einem timer zu definieren, die einen 'handler', der ausgelöst wird, wenn der timer abläuft (wie in diesem pseudo-code):

flag = false;
timer = new Timer(1000); //ms
timer.handler = function () { flag = true };

In diesem trivialen Fall ist, wird der timer würde-flag auf true nach 1 Sekunde. Wie kann ich die unit-test-das Eckige/Karma/Jasmin?

Vom Lesen der docs hätte ich erwartet, daß diese arbeiten:

... 
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
sleep(2)
expect(flag).toBe(true);
...

Eher als moralisch aufrecht, die testen, entschieden Versagen, mit diesem:

ReferenceError: Can't find variable: sleep

Nach einiger Lektüre, anscheinend kann ich nicht verwenden, Winkel-Szenario mit Jasmin. Ok, ich bin cool mit, dass.

UPDATE : Pro die Kommentare, die ich getestet habe, meine "arbeiten" settimeout-Methode. Es muss nicht immer aufgerufen.

, Damit das funktioniert:

... 
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
setTimeout(function () { expect(flag).toBe(true) }, 2000);
...

Aber fühlt sich ein wenig seltsam.

Frage: gibt es eine bessere Möglichkeit?

Spaß Trivia: Ja, ich weiß, über $timeout. Ich habe Sehr Gute Gründe(TM) für die Dinge tun, die ich Tat, tief in den code Minen, Weg vom Licht des Tages =)

  • warum hat die standard-timeout-das Gefühl, seltsam?
  • wenn Sie auf der $timeout-Sie in der Lage waren zu nennen, $timeout.flush(); mit dieser können Sie testen Sie die vorab-timer Bedingungen und die post-timer Bedingungen. Aber Sie wollen es nicht 🙂
  • Naja, ich weiß nicht, ob dies ist, warum es fühlte sich komisch vor, aber ich habe gerade getestet und das erwarten() innerhalb des timeout nicht tatsächlich aufgerufen (ich habe die Zeit auf 10 Sekunden und reran den test, aber es endete fast sofort).
  • Mein timer hat eine Methode äquivalent zu flush(), aber das ist nicht das, was ich bin versucht zu testen.
  • In deinem letzten code-snippet, wenn nicht der Timer() ausgelöst werden? Bei der Instanziierung Zeit?
  • haben Sie dies Lesen: htmlgoodies.com/beyond/javascript/... ?
  • Der timer ist auf "trigger" - Einstellung die Zeit, während der Aufbau in diesem Fall.
  • Nein, aber ich werde einen Blick drauf werfen.
  • also, wenn der timer auslöst, bei der Instanziierung übergeben, dann sind Sie wahrscheinlich die Zuordnung der hf nach der Tat.
  • Ich kam mit einer praktikablen Lösung, basierend auf dem Dokument, das Sie miteinander verknüpft. Wenn Sie wollen post eine Antwort, ich werde es Kredit. Ansonsten, gebe ich eine ausführliche Antwort selbst.
  • geben Sie bitte Ihre ausführliche Antwort!
  • In diesem Fall wird der handler war auf jeden Fall immer in die richtige Reihenfolge. Das Problem (jetzt aufgelöst) wurde in das test-framework beenden, bevor der Timer laufen konnte, hinunter. Ich konnte mir nicht vorstellen, "blocking" - Sequenzen (a-la-Winkel-Szenario) mit Jasmin. Aber anscheinend kann ich mit run()/waitsFor() =)
  • BTW, das war mit Abstand die Schnellste Auflösung ich habe eine Frage ALSO. Vielen Dank an Euch beide =)

InformationsquelleAutor Sir Robert | 2014-01-15
Schreibe einen Kommentar