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 是测试替身,要调用 mock,您必须实际调用 mock 上的方法,而不是其他对象。
而不是在您的代码中这样做:
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);
}
在一种方法中,我通常会这样做:
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 是测试替身,要调用 mock,您必须实际调用 mock 上的方法,而不是其他对象。
而不是在您的代码中这样做:
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);
}