JavaScript: Unit-Testing

Asynchrone Tests

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Asynchronen Code korrekt zu schreiben, ist nicht leicht. Ihn zu testen, ist noch viel schwieriger. Zum Glück hält Jasmine ab der Version 2.0 einen eleganten Helfer bereit, der asynchronen Tests den Schrecken nimmt.
04:49

Transkript

Vor uns sehen wir ein Objekt welches eine Eigenschaft "value" mit dem Wert 0 hat und eine Funktion "Do it". "Do it" bekommt eine Callback Funktion, die wir hier "CB" nennen, als Argument übergeben und ruft diese auf auf nachdem ein Intervall von 1000 Millisekunden abgelaufen ist. Die Grundidee ist, dass "Do it" den Wert des Felds "value" von 0 auf 1 ändert. Und das geschieht in einem Aufruf von "setTimeout" nach 1000 Millisekunden also einer Sekunde. Bedeutet also wenn wir auf "asyncDummy Do it" aufrufen, dann wird "value" eine Sekunde nach dem Aufruf von "Do it" den Wert 1 statt 0 haben. Wenn wir dies testen möchten, dann sieht der Test zunächst relativ einfach aus. Ich habe hier eine Suite die Suite "asyncDemo", innerhalb der Suite habe ich die Spec "should suppport async cause" und hier rufe ich "asyncDummy" auf und prüfe danach ob der Wert 1 ist, Wenn ich das Ganze ausführe, dann schlägt das fehl und das schlägt fehl, weil 0 anstatt von 1 als Wert zurückkommt. Das liegt daran, dass "Do it " den Wert von "value" ja erst nach einer Sekunde verändert. Die Überprüfung welchen Wert "value" jetzt hat, beziehungsweise ob "value" den Wert 1 hat, geschieht allerdings direkt nach dem Aufruf von "do it". (inaudible) 2.0 von Jasmine gibt es eine relativ elegante Möglichkeit so ein Problem zu lösen. Und zwar wurde die Möglichkeit eingeführt asynchronen Code einfach zu testen. Dazu muss der Aufruf der asynchronen Methode in eine Setup Funktion ausgelagert werden also in einen "before each block". Wenn ich nun den Code hier einfüge und das Ganze jetzt speichere, dann wir sehen, dass es immernoch fehlschlägt. Und das liegt daran, weil wir zunächst mitteilen müssen, dass "before each" komplett ausgefüllt worden ist. Und dazu können wir einen Parameter "done" definieren. Und "done" ist eine Funktion, die wir aufrufen müssen, sobald "before each" fertig ist. Wenn ich nun hier wieder "done" aufrufen würde, dann hätten wir wieder das gleiche Problem wie vorher, dass "done" ja Sofort aufgerufen wird nach dem "do it" aufgerufen worden ist, der Code läuft hier über asynchron. Also muss ich folgendes machen ich muss an "do it" "done" als Callback übergeben. Und jetzt sehen Sie hier unten der Test braucht jetzt mehr als eine Sekunde und ist diesmal erfolgreich, was ist also geschehen? Jasmine ruft "before each" auf und erkennt dass ein Parameter "done" deklariert wurde. Das Argument was übergeben wurde, das übergeben wir an unsere Funktion "do it". UNd "do it" geht hin und ruft das übergebene Argument als Funktion, auf nachdem der Wert umgesetzt worden ist. Und das Ganze geschieht hier nach einer Sekunde. Dass ich das "done" aufgerufen worden ist, weiß Jasmine anschließend, dass jetzt die Specs aufgeführt werden können. Heißt also, immer wenn sie asynchronen Code testen möchten, dann muss der Aufruf der asynchronen Funktionalität in der "before each" Funktion stattfinden, über "done" können Sie kennzeichnen, dass ab jetzt der Code fertig ist. Und deshalb jetzt die Specs ausgeführt werden können. Heißt, jeglicher Code, der in den "it"-Blöcken steht. Sowas würden Sie zum Beispiel dann machen, Wenn Sie ein Integrationstest schreiben, indem Sie zum Beispiel ein Excel Web Service aufrufen. Stellen Sie sich vor Sie machen irgenwie so etwas in der Richtung hier falls Sie (inaudible) benutzen, Sie rufen hier eine URL auf, und hätten dann hier einen "success" Callback und in dem "success" Callback würden sie "done" aufrufen. Ähnlich wäre es wenn Sie, Angular benutzen, auch hier würden Sie über den HTTP Server "get" aufrufen, dann hier eine URL übergeben und dann "when file", "this promise done" wiederum aufrufen. Egal welche Art von Framework Sie benutzen für welchen Code Sie es brauchen, wichtige ist lediglich jeglicher asynchroner Code kommt in den "before each" Teil Ihrer Suite.

JavaScript: Unit-Testing

Steigen Sie in die Grundlagen des Unit-Testings ein und sehen Sie, wie Sie mit dem Jasmine-Framework Ihren JAvaScript-Code professionell testen können.

2 Std. 7 min (21 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:19.05.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!