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.
...
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 =)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jasmin hat einen Weg, das zu tun async-Test mit wartet() oder waitsFor() und läuft(). Schauen hier.
Code wäre so etwas wie:
Hinweis von OP
Dies ist die richtige Lösung, so ich markiert es als angenommen. Ich eigentlich am Ende der Umsetzung ein Schlaf-wie-Methode basiert auf dieser Lösung und wollte es teilen, falls es für andere nützlich.
In der test-Datei:
Ich hoffe, dies ist nützlich! Ich werde es verlassen, als übung für den Leser, um herauszufinden, warum habe ich es auf diese Art und Weise =)
setTimeout(function () {expect(flag).toBe(true)}), 1100);
solltesetTimeout(function () {expect(flag).toBe(true)}, 1100);
- funktioniert Super! 🙂