首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# SystemWrapper模拟File.ReadAllLines

C# SystemWrapper模拟File.ReadAllLines
EN

Stack Overflow用户
提问于 2016-05-22 01:56:27
回答 1查看 2K关注 0票数 0

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

代码语言:javascript
复制
string[] lines = File.ReadAllLines(filename);

为了进行测试,我希望能够模拟文件系统,并且我已经听到了关于SystemWrapper的积极评论,所以我想使用这个库。

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

代码语言:javascript
复制
string[] lines = new FileWrap().ReadAllLines(filename);

现在,我的测试方法如下所示:(我与Rhino一起使用Microsoft.VisualStudio.TestTools.UnitTesting )

代码语言:javascript
复制
[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的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-22 10:43:47

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

而不是在代码中这样做:

代码语言:javascript
复制
string[] lines = new FileWrap().ReadAllLines(filename);

你需要这样做:

代码语言:javascript
复制
public void MethodThatReadsLines(IFileWrap fileReader) {
    string[] lines = fileReader.ReadAllLines(filename);
}

这样,您就可以从测试中注入模拟对象,并且它由生产代码使用,而不是当前使用的新创建的实例:

代码语言:javascript
复制
[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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37369797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档