Unit Tests & Moq

Unit Tests & Moq

Als ich in einem Projekt Tests schreiben musste, wurde ich gezwungen ein Mocking Framework kennen zu lernen. Ich habe nach ein bisschen Research für das Mocking Framework “Moq” entschieden. Es wurde mehrmals empfohlen und vor allem gab es sehr viele Tutorials und eine gute Dokumentation dazu. Jetzt möchte ich meine neue Erkenntnisse Dokumentieren und habe gedacht dass ein Blog Post dafür Ideal wär. In diesem Blog Post werde ich dementsprechend eine kurze Introduktion zu Unit Tests und Moq und danach werde ich mit einem Beispiel die Technologie genauer erklären und zeigen wie man sie benutzt.

Was sind Unit Tests?

Unit Tests sind modulare Tests die eine bestimme Methode testet. Das heisst, dass man bei Unit Tests Dependencies nicht testet sondern nur der Logik die den Parametern entnimmt, daraus ein Resultat produziert und  zurückgibt. Um den Dependencies zu ignorieren braucht man eben das Moq Framework (oder ein ähnliches), wie das ganze funktioniert erkläre ich später.
Unit Tests sind die schnellsten und einfachsten Tests. Darum sollte man sehr viele Unit Tests schreiben in vergleich mit andere Tests.
Ein gutes Bild ist der Test-Pyramide:

test-pyramide

Von der Test-Pyramide kann man zwei Sachen sehr schnell daraus lesen:

  • Wie bei eine normale Pyramide muss man mit den untersten Blöcke anfangen, nämlich den Unit Tests.
  • Der grössten Teil der Pyramide besteht aus Unit Tests, dass ist auch bei der Produktion so, man sollte viel mehr Unit Tests schreiben als zum Beispiel UI Tests.

Was ist Mocking und was ist Moq?

Mocking ist wenn man ein “fake Objekt” erstellt. Das heisst man macht eine Art von Kopie von das Objekt, die die Klasse braucht die man testen will und definiert die Rückgabe Werte der Methoden.
Zum Beispiel wenn ich ein Service habe, die aus der Datenbank eine Liste von Personen holt. Und meine Klasse die ich Testen eine Methode hat, die diese Service und Methode benutzt, muss ich der Dependency von der Datenbank irgendwie wegnehmen. Weil sonst ist es nicht nur ein Unit Test mehr sondern ein Integration Test.
Das kann ich mit das Mocking erreichen. Weil dann sage ich einfach, egal wie der Methode aufgerufen wird, gebe einfach eine vordefinierte Liste zurück.

Moq ist ein Framework die das Mocking sehr einfach macht. Einige der Vorteilen von Moq sind:

  • Gut Dokumentiert und es gibt viele Tutorials
  • Einfach zum Anwenden
  • “Strong typed” also keine “Magic Strings” und somit Compiler freundlich

Tutorial:

In diesem Tutorial werde ich ein einfaches Beispiel zeigen wie man Moq benutzten kann.
Ich werde für den Tutorial Visual Studio 2015 Pro und ein ASP .NET MVC Projekt verwenden.

Meine Methode, die in meiner HomeController steckt und ich testen will, ist von das IDataService Interface und erwartet eine Methode mit der name “GetTeams()”, die eine List von Teams zurückgibt.
methodetotest

Deswegen muss ich das Moq Framework vom Nuget Packet Manager herunterladen und ein Mock des Interfaces erstellen.
createmockobject

Als nächstes muss ich der Liste mit Teams erstellen die meine Mock-Methode zurückgeben soll.
definedata

Wenn ich meine Liste definiert habe, muss ich etwas was sich “Setup” nennt. Dabei bestimme ich was Methode X als Rückgabe wert zurückgeben sollte. In meinem Fall möchte ich ja die vordefinierte  Liste zurückgeben statt eine Datenbank Query-Resultat.
setupmethod

Als letztes muss ich mein Klasse erstellen mit meinen Mock, die Methode aufrufen und danach kontrollieren ob im ViewResult.Model die richtige Liste beinhaltet.
finishtest

 

 

Node.js

Node.js

Ich war am Montag Abend (21.03.2016) im Technopark-Winterthur bei der WWD(WintiWebDev-Talks) und habe ein Präsentation zu Node.js zugeschaut. Ich fand das Thema sehr interessant und habe mich bestummen ein Blogpost darüber zu schreiben.

Meine Bilder sind teilweise von der Präsentation, welche nicht mich gehört sondern Andi Neck ( @andineck).
Der ganze Präsentation findet ihr unter: http://intesso.github.io/nodejs-introduction/

Intro:

Wikipedia:
Node.js ist eine serverseitige Plattform zum Betrieb von Netzwerkanwendungen. Inbesondere lassen sich Webserver damit realisieren. Node.js basiert auf der JavaScript-Laufzeitumgebung “V8”, die ursprünglich für Google Chrome entwickelt wurde, und bietet daher eine ressourcensparende Architektur, die eine besonders grosse Anzahl gleichzeitig bestehender Netzwerkverbindungen ermöglicht.

Was nehmen wir davon aus:

  • Node.js ist ein JavaScript welcher auf dem Server lauft
  • Node.js basiert auf der gleichen JavaScript-Laufzeitumgebung wie Google Chrome
  • Node.js bietet eine ressourcensparende Architektur, was ein hohen Konzentrat von Netzwerkverbindungen ermöglicht.

Wer braucht Node.js?

comapnies_using_node

Node.js wird von mehr und mehr Firmen gebraucht und die Frage ist langsam nicht mehr “Wer es braucht?”, sondern “Wer nicht?”.

Trend von 2004 bis Heute (Januar 2016):
Trend

Man kann auf den ersten Blick sehen, dass node.js(Blau) von Aussenseiter zum Mainstream geworden ist und das spiegelt sich auch beim Job Suchen:
JobTrend

Wie wird Node.js eingesetzt:

Es gibt mehrere Frameworks für Node.js, womit man verschiedenen Sachen machen kann, hier sind einige Beispiele.

Okey, wir wissen das Node.js schnell am wachsen ist, wir wissen auch das Node.js mehrere Einsetzungsbereiche hat, aber wieso sollen wir Node.js einsetzten?

  • Es lauft mehr oder weniger überall (Windwos, Linux, Mac, Arm, Docker, und mehr..)
  • Man kann die gleiche Programmiersprache auf den Server sowie im Browser benutzten.
  • Ein sehr gutes Module System (npm)
  • Mehr als 250’000 npm Module
  • Gutes Open Source Community
  • Dank ein Event-Loop statt Event Threading ist Node.js sehr schnell und kann mehrere Request ohne Probleme aufnehmen

Was ist ein Event-Loop?
EventLoop

Ein Event-Loop ist ein Single Thread, welche alle Events auf eine “Queue” Art ausführt. Das heisst, dass der erste Event wird zuerst ausgeführt, abgeschlossen und erst dann kommt der nächste Event dran. Somit hat man kein “Thread Waiting”, sondern der Server kann alle seine Events eine nach den anderen ausführen ohne jemals warten zu müssen. Das macht den Server sehr schnell und stabil.

Links zum Lernen:

Link zum Ryan Dahls aller erste Node Präsentation: Youtube Ryan Dahl Presentation

JSON – JavaScript

Was genau ist JSON?             JSON_Icon

 

JSON steht für JavaScript Object Notation und ist einer einfach lesbaren Textform zum Zweck des Datenaustauschs zwischen Anwendungen. JSON ist sehr ähnlich zu XML(Extensible Markup Language), aber trotzdem nicht ganz gleich.

Abgesehen davon, dass nicht alle Unicode zeichen erlaubt sind, ist JSON unabhängig von der Programmiersprache.

JSON dient zur Übertragung und zum Speichern von strukturierten Daten. Vor allem wird es bei Webanwendungen und mobile Applikationen in Verbindung mit JavaScript oder WebSockets eingesetzt. Bei der Übertragung von Daten zwischen dem Client und dem Server.

Unterschiede zum XML

JSON ist eine moderner Datenformat(2005) in vergleich mit das ältere Datenformat XML(1997) und ist einfacher gestaltet.
JSON erscheint daher oft lesbarer und vorallem leichter zum Schreiben.

XML ist aber eine Auszeichnungssprache und somit vielseitiger einsetzbar als JSON, das nur ein Datenaustauschformat ist.

Vergleich der Aufbau vom File

JSON (226 Byte)
JSON_Syntax

XML (361 Byte)
XML_Syntax

Man merkt auf den ersten Blick, dass das XML File viel mehr Text hat. Auf ein ungefähr, ist ein XML File 50-65% grösser als ein JSON welcher die gleiche Informationen beinhaltet.

Ein JSON File mit JavaScript einlesen

Jetzt wenn wir wissen, was ein JSON File ist, wissen wir, wenn wir es brauchen kann, aber wie setzt man es im JavaScript ein?

Man kann eine eigene Funktion schreiben:
Syntax_EigeneMethode

Diese Funktion gibt alle Objekte vom File in ein Array als Return Wert zurück. Es gibt ebenfalls alle Objekte im Browser Console aus. Das macht das Debuggen viel einfacher!

Leider ist der “JSON.parse” nicht von alle Browsern unterstützt. Einige von den älteren Versionen kennt ihn nicht. Wenn man also eine sehr Stabile Seite entwickeln will, ist es besser wenn man Libraries wie zum Beispiel jQuery benutzt:
Syntax_jQuery
Dieser Code Snippet macht genau das gleiche wie der erster Methode.
Man darf einfach nicht vergessen den Library zu importieren 😉 

In meine Beispielen habe ich die Daten aus eine Lokalen JSON File gelesen, aber man muss den Code nur wenig anpassen wenn man das JSON als Rückgabe Wert von eine Request bekomme.