<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>DaRaFF&#039;s Blog &#187; mock</title>
	<atom:link href="http://daraff.ch/tag/mock/feed/" rel="self" type="application/rss+xml" />
	<link>http://daraff.ch</link>
	<description>Gedanken über Themen, die mich beschäftigen</description>
	<lastBuildDate>Sun, 05 Feb 2012 07:02:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Javascript Mocking mit JsMockito – Teil I</title>
		<link>http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/</link>
		<comments>http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 08:45:54 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[stub]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=1020</guid>
		<description><![CDATA[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 &#8230; <a href="http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Einleitung</strong></p>
<p>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 <a href="http://testdrivenwebsites.com/2010/04/19/java-script-xunit-style-frameworks-comparison/" target="_blank">TestDrivenWebsites</a> inspirieren lassen und mich für <a href="http://jsmockito.org/" target="_blank">JsMockito</a> 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.</p>
<p>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:</p>
<ul>
<li>JsMockito <a href="http://jsmockito.org/" target="_blank">Homepage</a></li>
<li><a href="http://github.com/chrisleishman/jsmockito" target="_blank">Sourcen</a> auf Github</li>
<li>JsMockito <a href="http://chrisleishman.github.com/jsmockito/api/1.0.2/" target="_blank">API</a></li>
</ul>
<p>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.</p>
<p><strong>Installation</strong></p>
<p>Es müssen die Sourcen von <a href="http://jshamcrest.destaquenet.com/" target="_blank">JsHamcrest</a> (JsMockito baut auf JsHamcrest auf) und <a href="http://jsmockito.org/" target="_blank">JsMockito</a> heruntergeladen und über die JsTestDriver.conf eingebunden werden.</p>
<p>Danach folgt die Integration in JsTestDriver mittels</p>
<pre class="brush:js">JsHamcrest.Integration.JsTestDriver();
JsMockito.Integration.JsTestDriver();</pre>
<p>Das wärs schon, JsMockito sollte nun einsatzbereit sein.</p>
<p><strong>Mocken von Objekten</strong></p>
<p>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.</p>
<p>Ich möchte nun anhand eines Beispiel zeigen, wie man die Abhängigkeiten mocken kann.</p>
<pre class="brush:js">myapp = {
    Greeter: {
        greet: function(name){
           return "Hello " + name + "!";
        },
        goodbye: function(name){
            return "Bye " + name + "!";
        }
    }
};</pre>
<p>Ich habe ein Objekt Greeter mittels Object Literals erzeugt.</p>
<p>Nun folgt der Test Code.</p>
<pre class="brush:js">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;
    }
});</pre>
<p>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 <a href="http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/" target="_blank">Artikel</a> über JsTestDriver erwähnt, werden veränderte Objekte, Funktionen und Variablen nicht mehr in den Originalzustand zurückversetzt, wenn die Tests erneut aufgerufen werden.</p>
<p>testMockupObjectGreeter zeigt nun auf, wie man ein Objekt mocken kann. Der wichtigste Teil ist die Zeile mit when()&#8230; 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 &#8220;Hello Mockito!&#8221; zurückgegeben wird.</p>
<p>Dieses when/then Konstrukt ist sehr mächtig. Man kann beliebige Dinge zurüc﻿kgeben &#8211; primitive Datentypen, Funktionen, Objekte usw.</p>
<p>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.</p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=1020&amp;md5=912ec9c973f7f81db8d796dcf480705a" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/07/javascript-mocking-mit-jsmockito-teil-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=1020&amp;md5=912ec9c973f7f81db8d796dcf480705a" type="text/html" />
	</item>
		<item>
		<title>Javascript Unit Testing mit JsTestDriver</title>
		<link>http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/</link>
		<comments>http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 06:00:07 +0000</pubDate>
		<dc:creator>DaRaFF</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Qualität]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[jstestdriver]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[software qualität]]></category>
		<category><![CDATA[test driven development]]></category>
		<category><![CDATA[testen]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://daraff.ch/?p=1009</guid>
		<description><![CDATA[Einführung Da ich mich momentan sehr für Qualität in der Softwareentwicklung interessiere, darf das Unit Testing natürlich nicht fehlen. Mit PHPUnit konnte ich nun schon einige sehr positive Erfahrungen machen. Da auch viele PHP Projekte mit Javascript arbeiten, suchte ich &#8230; <a href="http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Einführung</strong></p>
<p>Da ich mich momentan sehr für Qualität in der Softwareentwicklung interessiere, darf das Unit Testing natürlich nicht fehlen. Mit PHPUnit konnte ich nun schon einige sehr positive Erfahrungen machen. Da auch viele PHP Projekte mit Javascript arbeiten, suchte ich deshalb auch nach einen Testwerkezeug für JS.<br />
Auf der Webseite <a href="http://testdrivenwebsites.com/2010/04/19/java-script-xunit-style-frameworks-comparison/" target="_blank">Test Driven Websites</a> bin ich auf einen schönen Javascript Unit Testing Framework Vergleich gestossen. Der Favorit war ganz klar JsTestDriver und nach einigem weiteren Surfen im Netz, hat sich für mich dieser Eindruck bestätigt. Da es sehr viele Test Frameworks für Javascript gibt, habe ich den allgemeinen Eindrücken im Netz einfach vertraut und mich für JsTestDriver entschieden.</p>
<p><strong>Highlights von JsTestDriver</strong></p>
<ul>
<li>xUnit konformer Syntax (sprich, der Syntax lehnt sich an PHPUnit oder Junit an)</li>
<li>Die Tests benötigen kein HTML File, wie in anderen JS Testframeworks</li>
<li>Client/Server Architektur für Tests (Das Prinzip ist ähnlich wie bei Selenium) -&gt; Der Test-Server muss somit nicht lokal laufen</li>
<li>Durch die Client/Server Architektur können mehrere Browser gleichzeitig getestet werden</li>
<li>Plugin für Eclipse und IntelliJ IDEA &#8211; bei jedem Save werden die Tests automatisch durchgeführt</li>
<li>Plugin Architektur &#8211; JsTestDriver bietet Plugins um andere Unit Testing Frameworks oder auch Mocking Frameworks zu integrieren</li>
<li>Problemlos in Continuous Integration Prozess integrierbar</li>
</ul>
<p><strong>Stolpersteine</strong></p>
<ul>
<li>JsTestDriver besitzt keine Möglichkeit zu mocken (ok, alle anderen JS Frameworks auch nicht). Es kann aber problemlos ein Mocking Framework eingebunden werden</li>
<li>Achtung bei globalen Variablen/Funktionen/Objekte &#8211; werden die globalen Variablen beim Testdurchlauf überschrieben, haben sie beim nächsten Durchlauf immer noch den überschriebenen Wert. Dies gilt so lange, bis entweder der Server neu gestartet wird, oder das Source File, wo die Variable deklariert wurde verändert wird. Der Grund ist Performance: Der Server cacht alle .js Dateien und lädt sie nur neu, wenn eine Datei auch verändert wurde.</li>
</ul>
<p><strong>Installation</strong></p>
<p>Auf der JsTestDriver <a href="http://code.google.com/p/js-test-driver/wiki/GettingStarted" target="_blank">Homepage</a>, wird sehr einfach beschrieben, wie man das Framework installieren und konfigurieren kann.<br />
Auf der <a href="http://blog.james-carr.org/2009/06/16/more-test-driven-development-with-javascript-jstestdriver/" target="_blank">Homepage</a> von James Carr erfährt man weitere nette Details über JsTestDriver.</p>
<p><strong>Code Example</strong></p>
<pre class="brush:js">TestCase("MyTestCase", {
    setUp: function() {
        //...
    },

    testAssertionWithMessage: function() {
        assertTrue("this is not true", false);
    },

    testAssertionWithoutMessage: function() {
        var actual = 5;
        assertEqual(5, actual);
    },

    tearDown: function() {
        //...
    }
};</pre>
<p><strong>Fazit</strong></p>
<p>JsTestDriver ist für mich absolut empfehlenswert. Ich konnte mich dank den PHPUnit Kenntnissen sehr rasch im Framework zurechtfinden und hatte schon nach kurzer Zeit die ersten Tests geschrieben. Die grössten Vorteile sind für mich: CI, erweiterbar mit anderen Frameworks, Multibrowsertesting</p>
 <p><a href="http://daraff.ch/?flattrss_redirect&amp;id=1009&amp;md5=20fc354db0d3ab153a353c81f1313d65" title="Flattr" target="_blank"><img src="http://daraff.ch/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://daraff.ch/2010/07/javascript-unit-testing-mit-jstestdriver/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://daraff.ch/?flattrss_redirect&amp;id=1009&amp;md5=20fc354db0d3ab153a353c81f1313d65" type="text/html" />
	</item>
	</channel>
</rss>

