Javascript Mocking mit JsMockito – Teil I

Einleitung

Heute möchte ich über das Thema Mocking unter Javascript schreiben. Wie schon bei den Testing Frameworks, gibt es auch einige Mocking Frameworks. Ich habe mich wieder über TestDrivenWebsites inspirieren lassen und mich für JsMockito entschieden, welcher ein Klon vom entsprechenden JMock für Java ist. Ich setze in diesem Artikel voraus, das JsTestDriver installiert und einsatzbereit, da JsMockito integriert wird.

Dieses mal hatte ich es aber nicht so einfach, bis ich die ersten funktionierenden Beispiele hatte. Folgend liste ich die wichtigsten Quellen auf, auf welchen ich Beispiele für JsMockito gefunden habe:

Da in den kurz gehaltenene Beispielen die Benennung der Variablen vielleicht nicht immer Ideal gewesen ist (vorallem beim Function Mocking), dauerte es eine Weile, bis ich begriffen hatte, wie das Mocking anzuwenden ist. Ich versuche darum nochmals ein Beispiel durchzuspielen und auf die wichtigsten Punkte einzugehen.

Installation

Es müssen die Sourcen von JsHamcrest (JsMockito baut auf JsHamcrest auf) und JsMockito heruntergeladen und über die JsTestDriver.conf eingebunden werden.

Danach folgt die Integration in JsTestDriver mittels

JsHamcrest.Integration.JsTestDriver();
JsMockito.Integration.JsTestDriver();

Das wärs schon, JsMockito sollte nun einsatzbereit sein.

Mocken von Objekten

Ich arbeite momentan an einem Projekt, bei dem loose Kopplung von Objekten und Funktionen nicht existiert. Sprich, es werden neue Instanzen ohne Dependency Injection erzeugt. Somit wird das Mocken noch um einiges erschwert.

Ich möchte nun anhand eines Beispiel zeigen, wie man die Abhängigkeiten mocken kann.

myapp = {
    Greeter: {
        greet: function(name){
           return "Hello " + name + "!";
        },
        goodbye: function(name){
            return "Bye " + name + "!";
        }
    }
};

Ich habe ein Objekt Greeter mittels Object Literals erzeugt.

Nun folgt der Test Code.

TestCase("GreeterTest", {
    setUp: function() {
        //tmp backup, because myapp.Greeter is global and the mock
        //is overwriting the methods i mock
        this.tmpObjectGreeter = myapp.Greeter;
    },

    testMockupObjectGreeter: function(){
        //prepare an object for mocking - some stubbing functions will be added
        //to the object
        myapp.Greeter = mock(myapp.Greeter);
        //if i call greet() - return value = "Hello Mockito"
        //else nothing is happening to other functions in the object
        //same behaviour as before the mock
        when(myapp.Greeter).greet().thenReturn("Hello Mockito!");

        assertEquals("", "Hello Mockito!", myapp.Greeter.greet("Mr. Johnson"));
        assertEquals("", "Bye Mr. Johnson!", myapp.Greeter.goodbye("Mr. Johnson"));
    },

    tearDown: function() {
        //Restore myapp.Greeter to original
        myapp.Greeter = this.tmpObjectGreeter;
    }
});

Da ich beim mocken das real existierende globale Objekt Greeter verändere, muss ich Greeter im setUp zwischenspeichern und beim tearDown wieder in den Originalzustand zurückversetzen. Wie schon im letzten Artikel über JsTestDriver erwähnt, werden veränderte Objekte, Funktionen und Variablen nicht mehr in den Originalzustand zurückversetzt, wenn die Tests erneut aufgerufen werden.

testMockupObjectGreeter zeigt nun auf, wie man ein Objekt mocken kann. Der wichtigste Teil ist die Zeile mit when()… Hier kann definiert werden, welche Funktionen im Objekt gemockt werden sollen und wie der Mock beim Aufruf reagieren soll. thenReturn ist der einfachste Fall. Hier wird definiert, dass egal wie greet() aufgerufen wird, immer “Hello Mockito!” zurückgegeben wird.

Dieses when/then Konstrukt ist sehr mächtig. Man kann beliebige Dinge zurückgeben – primitive Datentypen, Funktionen, Objekte usw.

Im zweiten Teil werde ich auf das mocken von globalen Funktionen eingehen und noch ein bisschen mehr über die Möglichkeiten mit when/then aufzeigen.

3 Responses

  1. Hi Dear, are you truly visiting this website daily, if so after that
    you will without doubt get good knowledge.

    Also visit my web-site livres mobi – Terri

Leave a Reply

Your email address will not be published. Required fields are marked *