Welche Vorteile bietet das Umhüllen von Systemobjekten (File, ServiceController, etc.) mit dem Adapter-Pattern oder dem Umweg zum Komponententest?

8

Betrachten Sie die folgende Methode, die einen Dienst stoppt:

%Vor%

Um die Methode zu testen, habe ich grundsätzlich zwei Möglichkeiten:

  1. Verwenden Sie das Adaptermuster, um die Methoden der Klasse 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.
  2. Behalte die Klasse so wie sie ist und benutze sie Microsoft Moles (oder irgendein anderer Code Umleitungsrahmen) abzufangen die Aufrufe von 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?

    
Matt 09.02.2011, 14:51
quelle

2 Antworten

1

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:

Adapter / Fassade

  • Pro: Ermöglicht es Ihnen, eine sinnvolle Rolle mit Methoden zur Absichtsermittlung zu extrahieren. z.B. 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.)
  • Pro: Mocking-Frameworks würden Ihnen eine bessere Diagnose für Argument-Checks geben, wie oft sie aufgerufen wurden, Erwartungen, die nicht aufgerufen wurden usw.

Interceptor

  • Pro: Weniger Arbeit, wenn Sie nur daran interessiert sind, einen problematischen Aufruf einer Abhängigkeit auszuführen
  • Pro: Definitiv ein gutes Werkzeug in Ihrer Toolbox, wenn Sie mit altem Code arbeiten (wo die Angst vor Veränderungen überwältigend ist)
  • Con: Hat es eine MSTest-Abhängigkeit? Anfängliche Suchen scheinen darauf hinzuweisen, dass Sie einige Plugins oder Erweiterungen benötigen, wenn Sie nicht MSTest verwenden.
Gishu 10.02.2011, 06:08
quelle
1

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.

    
Matías Fidemraizer 09.02.2011 15:01
quelle