[英]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.