2011-01-06 3 views
4

In Antwort auf diese Frage here Jon Skeet beantwortet: >>Standalone Beispiel und Ausarbeitung für Interface-basierte Programmierung

Sie über spöttischen wirklich einfach testen können (ohne Mock-Klassen mit, die bekommt hässlich)

Ich möchte ein besseres Verständnis durch ein eigenständiges Beispiel erhalten, das diesen Aspekt ... sowohl die vor (hässlich) als auch die nach (schnittstellenbasierten) Szenarien in C# ausarbeitet.

Und auch darüber hinaus, wenn es ein Beispiel in dem .NET Framework-BCL selbst das wäre toll

Antwort

3

Sagen Sie bitte diese Methode haben alle Namen von Personen aus einer Datei zu holen:

string[] GetNamesFrom(string path) { } 

Um diese Methode zu testen, müssten Sie den Pfadnamen einer vorhandenen Datei angeben, für die einige Einstellungen erforderlich sind.

Vergleichen Sie das mit dieser Methode:

string[] GetNamesFrom(IFile file) 

Wenn IFile enthält eine GetContents() Methode, dann „echte“ Implementierung dieser Schnittstelle kann das Dateisystem zugreifen kann und die Mock-Klasse könnte einfach Ihre Testeingangsdaten zurückkehren .

eine Mock-Bibliothek wie moq Verwendung (http://code.google.com/p/moq/) wird dies ganz einfach:

var fileMock = new Mock<IFile>(); 
fileMock.Setup(f => f.GetContents()).Returns(testFileContents)); 
Assert.Equals(expectedNameArray, GetNamesFrom(fileMock.Object)); 

in das Dateisystem eine Datei Schreiben vor dem Test klingen mag nicht wie eine Menge Setup, aber wenn Sie laufen viel von Tests wird es ein Durcheinander. Durch die Verwendung von Interfaces und Mocking geschieht alles Setup innerhalb Ihrer Testmethode.

0

Spottungsklassen können bei der Umgestaltung vorhandenen Codes unschön werden. Stellen Sie sich eine Klasse:

public class A 
{ 
    private B _instanceOfB; 

    public void DoSomethingWithInstanceOfB() 
    { 
     // do something with _instanceOfB 
    } 
} 

Wenn Sie A verspotten, nicht nur tun müssen, um die Schnittstelle zu extrahieren und Refactoring im gesamten Code - aber Sie könnten auch anfangen müssen B und verspotten. Und so weiter, potentiell ad infinitum, in einer Unternehmensumgebung. Ein konkretes Beispiel könnte sein, dass B eine Klasse ist, die den Zugriff auf eine Ressource wie eine Datenbank verwaltet.

Verwandte Themen