首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟File.OpenWrite()

模拟File.OpenWrite()
EN

Stack Overflow用户
提问于 2015-03-19 15:52:40
回答 2查看 1.4K关注 0票数 0

我正在尝试编写一个单元测试,将其写入用File.OpenWrite()打开的文件。

我正在用SystemWrapper的IFileWrap接口包装文件。在生产中,我使用SimpleInjector注入SystemWrapper的FileWrap类的一个实例,这很好。但是我试图在我的单元测试中使用MOQ来模拟IFileWrap,这是行不通的。

我是SystemWrapper的新手,我正在尽我最大的努力弄清楚它是如何被使用的。据我所知,IFileWrap.OpenWrite()返回一个IFileWrap实例,您可以从该实例获得带有FileStreamInstance的流。

因此,在被测试的类中,我在构造函数中注入了一个IFileWrap:

代码语言:javascript
复制
public class ClassUnderTest
{
    private readonly IFileWrap fileWrap;

    public ClassUnderTest(IFileWrap fileWrap)
    {
        this.fileWrap = fileWrap;
    }

    ...
}

在我正在测试的方法中,我从FileStreamInstance获得了流:

代码语言:javascript
复制
var fsWrap = this.fileWrap.OpenWrite(fullPath);
var ostream = fswrap.FileStreamInstance;

在生产中,这很好,其中FileWrap是用fileWrap实例实例化的。但是在我的测试中,我试图为File.OpenWrite创建一个Mock,它返回一个模拟的FileStream:

代码语言:javascript
复制
var fileStreamMock = new Mock<IFileStreamWrap>();

var fileMock = new Mock<IFileWrap>();
fileMock.Setup(fm => fm.OpenWrite(It.IsAny<string>())).Returns(fileStreamMock.Object);

var classUnderTest = new ClassUnderTest(fileMock.Object);

当我在测试中的方法中,在调试器中,从我的单元测试中,fsWrap.FileStreamInstance是空的,当我希望它是我的模拟文件时。

对我做错了什么有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-19 16:17:16

您并不是为了返回任何内容而在FileStreamInstance上固执,所以Moq将返回null。

在创建FileStreamInstance模拟之后,您需要设置返回IFileStreamWrap的内容:

代码语言:javascript
复制
var fileStreamWrapMock = new Mock<IFileStreamWrap>(); // Was fileStreamMock
var fileStreamMock = new Mock<FileStream>();
fileStreamWrapMock.Setup(fswm => fswm.FileStreamInstance).Returns(fileStreamMock);
票数 1
EN

Stack Overflow用户

发布于 2018-07-27 07:03:44

我最近还在努力解决这个问题。我最初通过使用临时文件来解决这个问题,正如您在关于Chris Mantle's answer的评论中所建议的那样。最近我偶然发现了另一种方法,使用StreamInstance而不是FileStreamInstance (在提出问题时不确定这是否可用):

代码语言:javascript
复制
var outBuffer = new byte[512];
var fileWrap = new Mock<IFileWrap>();
var fileStreamWrap = new Mock<IFileStreamWrap>();
var stream = new Mock<IFileStreamWrap>();
fileStreamWrap.Setup(fsw => fsw.StreamInstance).Returns(new MemoryStream(outBuffer));

//I'm using File.Create to create temporary files with DeleteOnClose flag in the application, which get disposed before the function returns
fileWrap.Setup(fw => fw.Create(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<FileOptions>()))
    .Returns((string filepath, int i, FileOptions fo) =>
    {
        //I'm using filepath in a collection in my test to handle multiple files created in the application code
        return fileStreamWrap.Object;
    });


//Call application code that creates temporary file and closes eagerly with dispose.
//Application code will be something like:
var tempFileStream = _fileWrap.Create(tempFileName, 4096, FileOptions.DeleteOnClose);
using (var writer = new StreamWriter(tempFileStream.StreamInstance, Encoding.Default, 4096, true))
{...}


//Test file contents were written correctly into outBuffer
var outString = System.Text.Encoding.UTF8.GetString(outBuffer);
Assert.AreEqual("Important Business string", outString);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29149246

复制
相关文章

相似问题

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