Mocking Frameworks für WinRT

22. April 2013
Seit dem Release von Windows 8 und der Öffnung des Windows Store im Oktober letzten Jahres hat sich das Angebot an Tools zur professionellen Entwicklung von Windows Store Apps deutlich verbessert. Zum Beispiel bietet Visual Studio 2012 für die Entwicklung von Unit Tests für Windows Store Apps neben MSTest über Test Adapter auch Unterstützung für zahlreiche andere Unit Test Frameworks (NUnit, Xunit, MbUnit, etc.). Speziell für das Mocking gibt es jedoch aktuell noch wenige Möglichkeiten im Vergleich zur vollwertigen .NET-Plattform. Grund hierfür ist, dass die meisten Mocking Frameworks zur dynamischen Code-Generierung den System.Reflection.Emit-Namespace verwenden, der aber nicht Teil des WinRT Frameworks ist.

Aktuell sind folgende Mocking-Frameworks für WinRT verfügbar:

Microsoft Fakes Isolation Framework

Das Microsoft Fakes Isolation Framework ist ein Mocking-Framework, das aus dem Microsoft Research Projekt Microsoft Moles Isolation Framework entstanden ist.

Es unterstützt zwei unterschiedliche Ansätze zum Mocking:

  • Stubs ermöglichen – ähnlich wie in anderen Mocking-Frameworks – eine Klasse durch eine Testklasse zu ersetzen, welche dasselbe Interface implementiert. Dieser Ansatz setzt eine Anwendungsarchitektur voraus, in der Klassen nicht direkt von anderen Klassen abhängig sind, sondern nur von zugehörigen Interfaces ("Code against interfaces, not implementations").
  • Ein Shim geht einen Schritt weiter und modifiziert zur Laufzeit den kompilierten Code einer Anwendung, indem ein bestimmter Methodenaufruf durch einen Shim Code ersetzt wird. Dadurch können auch statische Methoden, nicht als virtual deklarierte Methoden, als sealed virtual deklarierte Methoden, etc. gemockt werden. Dieses Vorgehen bietet sich an, um Aufrufe in Assemblies zu ersetzen, die nicht modifiziert werden können (z.B. die .NET-Assemblies). Ein typisches Einsatzszenario wäre zum Beispiel das Ersetzen von DateTime.Now durch einen konstanten Rückgabewert.

Generell sollte die Anwendungsarchitektur so aufgebaut sein, dass Stubs zum Isolieren von Anwendungsteilen ausreichen. Shims bieten sich an, um die Anwendung zu Testzwecken von Fremdkomponenten, die keine testbare API bieten, unabhängig zu machen.

Der große Nachteil von Microsoft Fakes war bisher, dass es nur in der Ultimate Edition von Visual Studio verfügbar war. Microsoft hat sich jedoch aufgrund von User Requests aktuell entschlossen, Microsoft Fakes mit dem Update 2 für Visual Studio 2012 jetzt auch für die Premium Version verfügbar zu machen. Die aktuell verfügbare Version CTP 4 des Visual Studio Update 2 ist das planmäßig letzte Preview vor der finalen Version. Es handelt sich jedoch um eine Go Live-Version, die auch in Produktivumgebungen eingesetzt werden kann.

MoqRT

Bei MoqRT handelt es sich um eine Portierung der Moq Bibliothek, die um die Dynamic Proxy Komponente aus der Castle Core Bibliothek erweitert wurde, um die WinRT-Einschränkungen bzgl. dynamischer Code-Generierung zu umgehen. Hierbei wird die dynamische Code-Generierung durch eine Assembly ersetzt, welche im Testprojekt referenziert wird. Eine zusätzliche auszuführende Komponente überwacht die Kompilierung des Testprojekts und aktualisiert die Mock-Interfaces.

Der Nachteil von MoqRT ist, dass es sich noch um ein Alpha Release handelt und zahlreiche Installationsschritte auf jedem Entwicklungsrechner durchzuführen sind.

EasyMoq

EasyMoq umgeht die WinRT-Einschränkungen bzgl. dynamischer Code-Generierung dadurch, dass ein T4 Template die benötigten Mock Interfaces erzeugt. Die notwendigen Konfigurationsschritte sind:

  • Das NuGet-Package wird in dem Unit-Test-Projekt installiert.
  • In der durch das NuGet-Package erzeugten EasyMoqGeneratorImpl Klasse werden die notwendigen Mock Interfaces registriert.
  • Die Solution wird neu kompiliert.
  • Aus dem Kontextmenü der EasyMoq.tt Datei im Solution Explorer wird "Run Custom Tool" ausgeführt.
  • Anschließend können die neu erzeugten Mock Interfaces in den Unit Tests verwendet werden.

Bei EasyMoq handelt es sich um ein interessantes Projekt, welches sich aber noch in der Entwicklungsphase befindet. Es stellt auch nicht eine 1:1-Portierung der Moq-Bibliothek dar, da es von Grund auf neu geschrieben wird. Dies ist auch an der Syntax sichtbar (Beispiel: It.IsAny<string> aus Moq entspricht Allow.Any<T>() in EasyMoq).

Fazit

Falls in einem Windows Store App-Projekt die Premium oder Ultimate Edition von Microsoft Visual Studio zum Einsatz kommt, bietet sich seit kurzem die Verwendung des Microsoft Fakes Isolation Frameworks an, da es sich hierbei um die ausgereifteste Lösung handelt. Bei Projekten, die höchstens Visual Studio Professional Edition als Entwicklungsumgebung einsetzen, ist EasyMoq eine mögliche Alternative. Hier ist zu beobachten, wie sich das Projekt weiterentwickelt.