簡體   English   中英

C#SystemWrapper模擬File.ReadAllLines

[英]C# SystemWrapper mock File.ReadAllLines

在一種方法中,我通常會這樣做:

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

為了進行測試,我希望能夠模擬出文件系統,並且我聽到了有關SystemWrapper的正面評論,因此我想使用該庫。

據我了解,使用SystemWrapper要求我執行基於接口的調用。 沒關系。 所以我上面的代碼行變成:

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

現在,我的測試方法如下所示:(我將Microsoft.VisualStudio.TestTools.UnitTesting與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();
}

此示例改編自SystemWrapper的“ 入門”頁面上的示例。

但是,當我這樣做時,該方法未調用我的模擬方法,而是在調用File.ReadAllLines ,這不是我所期望的。

模擬File.ReadAllLines的正確方法是什么?

Moq是測試的兩倍,要調用該模擬,您必須實際上在該模擬上而不是在其他對象上調用該方法。

而不是在您的代碼中執行此操作:

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

您需要執行以下操作:

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

這樣,您可以從測試中注入模擬對象,並且該對象將由生產代碼使用,而不是您當前正在使用的新創建的實例:

[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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM