我正在尝试编写一个单元测试,将其写入用File.OpenWrite()打开的文件。
我正在用SystemWrapper的IFileWrap接口包装文件。在生产中,我使用SimpleInjector注入SystemWrapper的FileWrap类的一个实例,这很好。但是我试图在我的单元测试中使用MOQ来模拟IFileWrap,这是行不通的。
我是SystemWrapper的新手,我正在尽我最大的努力弄清楚它是如何被使用的。据我所知,IFileWrap.OpenWrite()返回一个IFileWrap实例,您可以从该实例获得带有FileStreamInstance的流。
因此,在被测试的类中,我在构造函数中注入了一个IFileWrap:
public class ClassUnderTest
{
private readonly IFileWrap fileWrap;
public ClassUnderTest(IFileWrap fileWrap)
{
this.fileWrap = fileWrap;
}
...
}在我正在测试的方法中,我从FileStreamInstance获得了流:
var fsWrap = this.fileWrap.OpenWrite(fullPath);
var ostream = fswrap.FileStreamInstance;在生产中,这很好,其中FileWrap是用fileWrap实例实例化的。但是在我的测试中,我试图为File.OpenWrite创建一个Mock,它返回一个模拟的FileStream:
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是空的,当我希望它是我的模拟文件时。
对我做错了什么有什么想法吗?
发布于 2015-03-19 16:17:16
您并不是为了返回任何内容而在FileStreamInstance上固执,所以Moq将返回null。
在创建FileStreamInstance模拟之后,您需要设置返回IFileStreamWrap的内容:
var fileStreamWrapMock = new Mock<IFileStreamWrap>(); // Was fileStreamMock
var fileStreamMock = new Mock<FileStream>();
fileStreamWrapMock.Setup(fswm => fswm.FileStreamInstance).Returns(fileStreamMock);发布于 2018-07-27 07:03:44
我最近还在努力解决这个问题。我最初通过使用临时文件来解决这个问题,正如您在关于Chris Mantle's answer的评论中所建议的那样。最近我偶然发现了另一种方法,使用StreamInstance而不是FileStreamInstance (在提出问题时不确定这是否可用):
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);https://stackoverflow.com/questions/29149246
复制相似问题