C#SystemWrapper mock File.ReadAllLines

C#SystemWrapper mock File.ReadAllLines,c#,unit-testing,mocking,filesystems,systemwrapper,C#,Unit Testing,Mocking,Filesystems,Systemwrapper,在某种方法中,我通常会这样做: string[] lines = File.ReadAllLines(filename); public void MethodThatReadsLines(IFileWrap fileReader) { string[] lines = fileReader.ReadAllLines(filename); } 为了测试,我希望能够模拟文件系统,并且我听到了一些积极的评论,所以我希望使用这个库 据我所知,使用SystemWrapper需要进行基于接口的

在某种方法中,我通常会这样做:

string[] lines = File.ReadAllLines(filename);
public void MethodThatReadsLines(IFileWrap fileReader) {
    string[] lines = fileReader.ReadAllLines(filename);
}
为了测试,我希望能够模拟文件系统,并且我听到了一些积极的评论,所以我希望使用这个库

据我所知,使用SystemWrapper需要进行基于接口的调用。那很好。因此,我上面的代码行变成:

string[] lines = new FileWrap().ReadAllLines(filename);
现在,我的测试方法如下所示:(我将Microsoft.VisualStudio.TestTools.UnitTesting与Rhino Mock结合使用)

[TestMethod()]
公共无效测试\u此\u方法()
{
IFileWrap fileWrapRepository=MockRepository.GenerateMock();
expect(x=>x.ReadAllLines(“abc.txt”).Return(新字符串[]{“第1行”、“第2行”、“第3行”});
方法readslines();
}
此示例改编自SystemWrapper的入门页面上的一个示例

但是,当我这样做时,该方法不是调用我的模拟方法,而是调用
File.ReadAllLines
,这不是我所期望的


模拟
文件的正确方法是什么。ReadAllLines

Moq是测试的两倍,对于要调用的模拟,您必须在模拟上实际调用该方法,而不是在其他对象上

不要在代码中执行此操作:

string[] lines = new FileWrap().ReadAllLines(filename);
您需要这样做:

string[] lines = File.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);
}
[TestMethod()]
公共无效测试\u此\u方法()
{
IFileWrap fileWrapRepository=MockRepository.GenerateMock();
expect(x=>x.ReadAllLines(“abc.txt”).Return(新字符串[]{“第1行”,
“第2行”、“第3行”});
方法读取行(fileWrapRepository.Object);
}

Moq是测试的两倍,要调用mock,您必须在mock上实际调用该方法,而不是在其他对象上

不要在代码中执行此操作:

string[] lines = new FileWrap().ReadAllLines(filename);
您需要这样做:

string[] lines = File.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);
}
[TestMethod()]
公共无效测试\u此\u方法()
{
IFileWrap fileWrapRepository=MockRepository.GenerateMock();
expect(x=>x.ReadAllLines(“abc.txt”).Return(新字符串[]{“第1行”,
“第2行”、“第3行”});
方法读取行(fileWrapRepository.Object);
}

我应该如何调用MethodThatReadsLines in normal code=在测试之外?我应该如何调用MethodThatReadsLines in normal code=在测试之外?