Als Begleiter meiner Blog -Serie über .NET -Mocking -Frameworks und ihrer Funktionsweise versucht dieses Repository, dieselben Unit -Tests mit Mocks mit den für .NET verfügbaren wichtigsten Mocking -Frameworks zu implementieren.
Dieses Projekt soll eine Referenz für alle sein, die .NET -Mocking -Frameworks vergleichen oder Syntax -Beispiele für ein bestimmtes Framework ansehen möchten. Es ist nicht beabsichtigt, eine erschöpfende Referenz zu sein, nicht gar nicht fehlerfrei sein (aber lassen Sie mich wissen, wenn Sie Probleme finden).
Um Tests zu schreiben, benötigen wir einen Code, der getestet werden muss. So habe ich den LunchNotifier erstellt, eine etwas mehr als Hello-Welt-Klasse, gegen die Unit-Tests (mit Mocks) geschrieben werden können.
Einer der Vorteile, die für den Stapel von überlaufen Emplpoyees im New Yorker Büro gestapelt werden können, ist das kostenlose Mittagessen von internen Köchen. Jeden Tag, wenn die Köche die Zubereitung der Mahlzeit abgeschlossen haben, wird an die Mitarbeiter im Büro eine Benachrichtigung erfolgt, um sie darüber zu informieren, dass Lebensmittel verfügbar sind.
Im CodeBeingTested -Projekt ist die LunchNotifier -Klasse unser Hauptziel.
Diese Klasse nimmt an fünf externen Abhängigkeiten, die verspottet werden müssen, um unsere Tests durchzuführen:
INotificationService (über Konstruktor injiziert)ILogger (über Konstruktor injiziert)IEmployeeService (über den Konstruktor injiziert)IEmployee -Objekte) im New Yorker Büro zu erhaltenIEmployee (zurückgekehrt von IEmployeeService )System.DateTime Die Hauptlogik ist im LunchNotifier.SendLunchtimeNotifications() Diese Methode enthält einen Inline -Aufruf an System.DateTime.Now , der nicht durch konstruierte Frameworks wie MOQ oder Rhinomocks verspottet werden kann:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Eine alternative Implementierung wird DateTime.Now Verwendung durch konstante Frames im LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() bereitgestellt.
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Jedes der verbleibenden Projekte versuchen, einen ähnlichen Satz von Unit -Tests gegen das LunchNotifier unter Verwendung verschiedener Verspottungs -Frameworks zu implementieren.
Alle Tests werden mit Nunit v3.10 über das Nuget -Paket geschrieben.
In einigen Fällen gibt es mehrere Möglichkeiten, sich einem Test mit dem Spott -Framework zu nähern. Daher habe ich mehrere Varianten des Tests bereitgestellt, um die verschiedenen Ansätze zu präsentieren.
Dieser Test erstellt einen Mock -Mitarbeiter "Bob", der E -Mail -Benachrichtigungen bevorzugt und Mocks verwendet, um sicherzustellen, dass die Logik LunchNotifier ihm eine E -Mail sendet, wenn das Mittagessen fertig ist.
Dieser Test erstellt zwei Scheinmitarbeiter, "Bob" und "Martha", und stellt sicher, dass beim Senden einer Benachrichtigung an einen von ihnen den Fehler entsteht und nicht verhindern, dass die verbleibenden Mitarbeiter benachrichtigt werden.
Dieser Test verwendet TestCase -Syntax von Nunit, um zwei Testfälle auszuführen, eine für vor 13 Uhr und eine für nach 13 Uhr, um sicherzustellen, dass die entsprechende Benachrichtigungsvorlage basierend auf der Tageszeit verwendet wird.
Für nicht eingeschränkte Frameworks kann DateTime.Now direkt gesteuert werden, um die Eingangszeit des Tests zurückzugeben. Eingeschränkte Frameworks können jedoch nicht. Daher müssen sie den Aufruf an DateTime.Now extrahieren. Now in eine Spated -Methode und stattdessen das Verhalten dieser neuen Methode ändern. Somit ist die Notwendigkeit der Variante SendLunchtimeNotifications_DateTimeSeam .
Typ: eingeschränkt
Projekt: https://github.com/moq/moq4/wiki/quickstart
Nuget: https://www.nuget.org/packages/moq/
Typ: eingeschränkt
Projekt: https://github.com/hibernating-rhinos/rhino-mocks
Nuget: https://www.nuget.org/packages/rhinomocks
WARNUNG: Rhinomocks ist effektiv ein totes Projekt und wird wahrscheinlich keine Unterstützung für zukünftige Änderungen in .NET wie .NET Core bieten. Ich schlage nicht vor, dass Sie mit diesem Framework beginnen, wenn Sie es noch nicht verwenden.
Um diese Tests auszuführen, müssen Sie VS2017 Enterprise (oder Äquiv) installiert haben.
Typ: eingeschränkt
Projekt: http://nsubstitute.github.io/
Nuget: https://www.nuget.org/packages/nsubstitute
Typ: ungezwungen
Microsoft Fakes ist Teil des Visual Studio 2017 Enterprise oder Visual Studio 2015 Ultimate und ist nicht als Spatchkomponente verfügbar.
Fakes unterstützt nicht nativ die AssertWasCalled Stilvalidierung. Daher verwende ich ein zusätzliches Nuget -Paket (das ich dazu beigetragen habe), um diese Funktion bereitzustellen: fakes.contrib / nuget
Typ: ungezwungen
Produktinformationen: https://www.typemock.com/isolator
Dieses Produkt erfordert eine kostenpflichtige Lizenz (es gibt eine kostenlose 15-tägige Testversion), um sich nicht zu verspotten. Typemock war gut genug, um mir eine kostenlose Community -Lizenz zu bieten, damit ich an Projekten wie diesem arbeiten kann.