2016-05-22 8 views
0

In einer Methode, die ich in der Regel so etwas tun würde:C# SystemWrapper Mock File.ReadAllLines

string[] lines = File.ReadAllLines(filename); 

Um zu testen, würde Ich mag Lage sein, das Dateisystem zu verspotten, und ich habe positive Kommentare gehört über SystemWrapper, also möchte ich diese Bibliothek verwenden.

Wie ich verstehe, erfordert die Verwendung von SystemWrapper, dass ich Interface-basierte aufrufen. Das ist gut. Also meine obige Codezeile wird:

string[] lines = new FileWrap().ReadAllLines(filename); 

Nun, mein Testmethode sieht wie folgt aus: (Ich verwende Microsoft.VisualStudio.TestTools.UnitTesting in Verbindung mit Rhino Mock)

[TestMethod()] 
public void Test_this_method() 
{ 
    IFileWrap fileWrapRepository = MockRepository.GenerateMock<IFileWrap>(); 
    fileWrapRepository.expect(x => x.ReadAllLines("abc.txt").Return(new string[] {"Line 1", "Line 2", "Line 3"}); 

    MethodThatReadsLines(); 
} 

Dieses Beispiel ist an ein Beispiel auf der Seite SystemWrapper Getting Started angepasst.

Wenn ich dies tue, ruft die Methode jedoch nicht meine verspottete Methode auf, sie ruft File.ReadAllLines auf, was nicht das ist, was ich erwarte.

Was ist der richtige Weg, um File.ReadAllLines zu verspotten?

Antwort

3

Moqs sind Testdoppelwerte, für das Aufrufen des Mocks müssen Sie die Methode tatsächlich auf dem Mock aufrufen, nicht auf einem anderen Objekt.

Statt diese in Ihrem Code zu tun:

string[] lines = new FileWrap().ReadAllLines(filename); 

Sie brauchen so etwas wie dies zu tun:

public void MethodThatReadsLines(IFileWrap fileReader) { 
    string[] lines = fileReader.ReadAllLines(filename); 
} 

diese Weise können Sie das Mock-Objekt injizieren, von Ihnen testen und es wird von Ihr Produktionscode und nicht die neu erstellte Instanz, die Sie gerade verwenden:

[TestMethod()] 
public void Test_this_method() 
{ 
    IFileWrap fileWrapRepository = MockRepository.GenerateMock<IFileWrap>(); 
    fileWrapRepository.expect(x => x.ReadAllLines("abc.txt").Return(new string[] {"Line 1", 
                     "Line 2", "Line 3"}); 

    MethodThatReadsLines(fileWrapRepository.Object); 
}