Jasmine: Von Spionen und Zielpersonen – Teil 1 Grundlagen von Spies

Jasmine ist ein Framework zur Gestaltung von BDD-Tests für JavaScript. Im Wesentlichen werden Jasmine-Tests gebildet aus describe-Blöcken, die Suiten repräsentieren, und it-Blöcken, die Testfälle repräsentieren. Beiden wird eine textuelle Beschreibung sowie eine auszuführende Funktion übergeben. Erwartungen werden über expect mit unterschiedlichen Matchern abgefragt. Mit diesen Mitteln kommt man schnell zu ausführbaren Tests, deren Ausgabe sich der Texte aus den describes und its sehr übersichtlich bedient (siehe Bild am Ende des Beitrags). Einblicke in Jasmine sind unter http://jasmine.github.io zu finden.

In drei Beiträgen schauen wir uns einen Teilbereich von Jasmine an, nämlich die Möglichkeiten, ein Mocking durchzuführen. Das Mocking in Jasmine erfolgt mittels Spionen (engl. Spies). In diesem ersten Teil werden deren Grundlagen vorgestellt. Weitere Beiträge zu den Spionen und weiterführenden Funktionen folgen!

Hinweis: Folgende Beschreibungen und Code-Beispiele sind auf Basis von Jasmine 2.2.

Auf den ersten Blick haben Jasmine-Spione erstmal nichts mit dem eigentlichen Mocking an sich zu tun. Sie spionieren vordergründig Funktionen und ihre Aufrufe aus. Dabei gelten folgende Regeln:

  • Ein Spion existiert nur in dem describe– oder it-Block, in dem er definiert wurde.
  • Eine zu spionierende Funktion muss öffentlich zugreifbar sein. Private Funktionen findet ein Spion nicht.
  • Der Spion wird mit spyOn(Zielperson, ‚Name der auszuspionierenden Aktion‘) auf die zu spionierende Funktion angesetzt. Dabei werden die Instanz des Objektes sowie der Name der Funktion als String übergeben. Dies muss vor dem Aufruf des zu testenden Codes durchgeführt werden.

Die grundlegendste Funktion, die ein Spion kann, ist toHaveBeenCalled. Diese ermittelt, ob eine Funktion eines bestimmten Objektes aufgerufen wurde.

Daneben können Spione die Parameter der Funktionsaufrufe mit toHaveBeenCalledWith überprüfen.

Wird ein Spion lediglich mit spyOn initiiert, verhindert er die Durchführung der eigentlichen Funktion.

Will man, dass die Funktion auch ausgeführt wird, kann man dies mit and.callThrough bewirken. Daneben wird der Auftrag des Spions weiter ausgeführt.

Nun kommt das Mocking wieder ins Spiel, denn neben callThrough gibt es noch die drei weiteren Funktionen returnValue, callFake und throwError, die an den Spion übergeben werden können. Diese heben die eigentliche Funktion auf und fügen eigene Werte bzw. Funktionen ein.

Über and.returnValue kann ein Rückgabewert einer Funktion definiert werden.

and.callFake definiert eine Funktion, die anstelle der ursprünglichen Funktion aufgerufen wird.

Die Rückgabe eines Fehlers mittels and.throwError kann ebenfalls beim spyOn eingesetzt werden. Zum Überprüfen des zurückgegebenen Fehlers steht der Matcher toThrowError zur Verfügung.

Zu guter letzt gibt es noch die Möglichkeit, callThrough-Funktionen wieder wirkungslos zu machen. Dazu gibt es and.stub, welches an die auszuspionierende Funktion selber gekettet wird.

Übersicht über die Funktionen eines Spions

Jasmine_Teil1

Verfasst von Konstanze Steinhausen am 17. Januar 2017 Verfasst von Konstanze Steinhausen am