Für das Unit-Testing sind Mocking-Frameworks wie Moq enorm hilfreich, um einzelne Komponenten ohne externe Abhängigkeiten testen zu können. In Unit-Test-Projekten für WinRT können solche Mocking-Frameworks jedoch leider nicht verwendet werden, denn die meisten Mocking-Frameworks arbeiten mit dynamischen Proxy-Klassen, die zur Laufzeit erzeugt werden. Dieses Vorgehen wird innerhalb der Windows Runtime nicht unterstützt. Es gibt inzwischen zwar Bibliotheken, die das Mocking auf der WinRT-Plattform ermöglichen sollen, wie beispielsweise das sogenannte MoqRT. Diese befinden sich bisher aber alle nur in einem Proof-of-Concept-Status.

Mocking-Frameworks lassen sich somit für Windows Store Apps, Windows Phone Apps und Klassenbibliotheken für die Windows Runtime nicht verwenden. Meistens enthalten diese Bibliotheken aber auch Services oder Controller, die unabhängig von der Windows Runtime arbeiten und somit eigentlich mit solchen Frameworks verwendet werden können. Es kann jedoch nicht mit einem herkömmlichen Unit-Test-Projekt für .NET auf ein WinRT-Projekt referenziert werden.

Dieser Artikel zeigt eine Möglichkeit auf, mit der sich solche Klassen aus einem bestehenden Projekt über Mocking-Frameworks testen lassen. Für die Komponenten, die von WinRT-spezifischen Funktionalitäten abhängig sind, funktioniert die hier beschriebene Vorgehensweise nicht, die Mocking-Klassen müssen nach wie vor manuell erzeugt werden.

** Beispiel **

In folgenden Beispiel soll der MovieCachingService unter der Zuhilfename von Moq getestet werden. Das Beispielprojekt besteht hier aus einer universellen Windows-App, die verschiedene Services im Shared-Projekt enthält, die Abhängigkeiten zueinander aufweisen.

Ausgangsprojekt mit MovieCachingService, der getestet werden soll Ausgangsprojekt mit MovieCachingService, der getestet werden soll

1. Klassenbibliothek erstellen

Zur Lösung des besagten Problems erstellen wir eine neue Klassenbibliothek für .NET (hier MovieTesting.TestClasses). Dieser fügen wir alle Klassen und Interfaces aus dem vorhandenen WinRT-Projekt als Link hinzu. Da es sich um eine .NET-Klassenbibliothek handelt, können nur die Klassen hinzugefügt werden, die unabhängig von der Windows Runtime arbeiten. Somit wird der LocalStorageService nicht hinzugefügt.

Tipp: Um einem Projekt bestehende Dateien als Link hinzuzufügen, wählt man im Projektexplorer im Kontextmenü „Hinzufügen / Vorhandenes Element„. Neben der Schaltfläche „Hinzufügen“ lässt sich über den Pfeil die Option „Als Link hinzufügen“ auswählen. Alternativ können die Dateien auch per Drag-and-drop mit gedrückter Alt-Taste ins Zielprojekt gezogen werden.

Option „Als Link hinzufügen“ und Vorschau der Projektmappe Option „Als Link hinzufügen“ und Vorschau der Projektmappe

2. Unit-Test-Projekt erstellen

Im nächsten Schritt wird ein herkömmliches Unit-Test-Projekt für .NET erstellt (hier MovieTesting.Tests). Über den Verweis-Manager wird daraufhin ein Verweis auf die eben erstellte Klassenbibliothek MovieTesting.TestClasses erzeugt. Dadurch kann nun aus dem Testprojekt heraus auf den MoveCachingService zugegriffen werden.

3. Mocking-Framework installieren und loslegen

Nun kann wie gewohnt im Testprojekt ein Mocking-Framework hinzugefügt und ohne Beschränkung fleißig drauf los getestet werden. Es muss jedoch bei einem möglichen Refactoring darauf geachtet werden, die Anpassungen gegebenenfalls auch in der oben erstellten Klassenbibliothek durchzuführen, damit das Testprojekt weiterhin Zugriff auf die benötigten Dateien erhält.

4. Zusammenfassung:

In diesem Artikel wurde gezeigt, wie WinRT-unabhängige Komponenten, die jedoch in einem WinRT-Projekt enthalten sind, über Umwege in Unit-Test-Projekten mit Mocking-Frameworks getestet werden können.

Hierzu wurde eine Klassenbibliothek als Wrapper-Projekt erzeugt, welche Referenzen zu den Quelldateien aus den WinRT-Projekten enthält. Auf diese Bibliothek kann dann über ein ganz normales Unit-Test-Projekt zugegriffen werden, das ein Mocking-Framework verwenden kann. Alternativ ist es auch möglich, die Dateien direkt als Link dem Unit-Test-Projekt hinzuzufügen. In diesem Fall kommt man ohne zusätzliche Klassenbibliothek aus.

Beispielprojekt

Das Beispielprojekt ist hier auf GitHub zu finden.