Betrachten Sie die folgende Methode, die einen Dienst stoppt:
%Vor%Um die Methode zu testen, habe ich grundsätzlich zwei Möglichkeiten:
ServiceController
in eine Schnittstelle zu integrieren, die ich steuern kann. Diese Schnittstelle kann dann in die Serviceklasse eingefügt werden (a.k.a Inversion of Control). Auf diese Weise habe ich einen lose gekoppelten Code und kann die traditionellen Mock-Frameworks zum Testen verwenden. ServiceController
an
Ergebnisse in Dosen zum Testen zurückgeben
Zwecke. Ich stimme zu, dass für den Domänenmodell-Code die Verwendung des "traditionellen" Einheitentest-Ansatzes am sinnvollsten ist, da dies zu einem Design führt, das am einfachsten zu pflegen ist. Für Code, der sich mit der .net-Implementierung von Windows-API-bezogenen Inhalten (Dateisystem, Dienste usw.) befasst, gibt es jedoch einen Vorteil, die zusätzliche Arbeit zu durchlaufen, um "traditionell" testbaren Code zu erhalten?
Es ist schwer für mich, die Nachteile der Verwendung von Microsoft Moles für Dinge wie ServiceController
(oder das Objekt File
) zu sehen. In diesem Fall sehe ich keinen Vorteil darin, den traditionellen Ansatz zu verfolgen. Fehle ich etwas?
Gute Frage, btw .. Ich habe mir gerade ein Video von MS Moles angeschaut. Obwohl ich MS-Unit-Test-Tools skeptisch gegenüberstehe, muss ich sagen, dass es interessant aussieht. Mein Vergleich steht bei:
ServiceManager.StartService(name)
könnte die Details {1 abstrahieren. ServiceController.GetServices (), 2. behandelt den Fall, in dem ServiceController.Status! = Gestoppt ist, 3. ServiceController.Start ()}. Der Schein / Schein-Ansatz würde weniger Arbeit erfordern als die Einrichtung von drei Delegierten. Hier ist dieser Ansatz eine Gelegenheit, Ihr Design zu verbessern, indem Sie sinnvolle Verträge / Schnittstellen entwickeln (ermöglicht Ihnen auch das Ausblenden von Dingen, die Ihnen egal sind - z. B. Winapi-Semantik, Konstanten usw.) Ich glaube, dass dies ein guter Fall für Spott ist und es gibt einige Vorteile, es mit IoC zu tun:
Sie führen tatsächliche Komponententests durch, da Ihre Tests keine zugrunde liegenden Schichten testen - dies wäre ein Integrationstest.
Einfaches Stecken und Ziehen eines Mock-Objekts.
Sie müssen keine "falsche" Implementierung für jeden Stub definieren. Sie haben eine "falsche", verspottete Implementierung durch Konfiguration.
Für mich ist der erste Grund der wichtigste.
Warum sollst du Moles nicht benutzen? Weil ich glaube, dass es nicht das richtige Werkzeug für so etwas ist. Moles ist mehr für Dinge wie Ich möchte einen festen Wert von DateTime.Now zu einer bestimmten Zeit, so dass Sie etwas Code in einer Situation testen können, wann immer Sie wollen, ohne Probleme.
Moles ist eine einfache Möglichkeit, um bestimmte Methoden, Eigenschaften in bestimmten Tests automatisch vorzutäuschen, während IoC + Fälschung, es ist, Ihren Test zu isolieren.
Tags und Links c# unit-testing design vb.net mocking