我希望测试一个使用 File.OpenRead()
方法获取文件内容的类。读取文件内容后,该类会处理这些内容。我已经创建了一个接口和一个包装静态 OpenRead()
方法的类。但是,我遇到了一个问题,即 OpenRead()
返回一个 FileStream
,我不知道如何“模拟”文件流。
目前,我只能创建一个文件来创建一个 FileStream
... 当然,测试通常会因为文件仍在使用中而失败并抛出 IOException
异常...
简化的示例代码如下:
class FileProcessor
{
public FileProcessor(IFileWrap fileWrap) // fileWrap only redirects the calls to the static methods of File class
{ ... }
public void Process(string file)
{
var content = fileWrap.ReadAllLines(file);
// process content
}
}
并且测试:
[TestClass]
public class FileProcessor_Test
{
[TestMethod]
Process_FileNotReadable_Exception()
{
File.WriteAllText(testFile, "something");
var fileWrapMock = new Mock<IFileWrap>();
FileProcessor dut = new FileProcessor(fileWrapMock.Object);
var actualException = AssertException.Throws<Exception>(() => dut.Process(testFile));
}
}
我希望也不用创建一个
FileStream
的抽象。我曾希望能够创建一个
MemoryStream
并将其作为输入的方式,但这将需要更改文件包装器并偏离实际的 File
类。欢迎提供任何意见 :)
编辑: 处理过程包括通过从类
MD5
调用 ComputeHash()
来计算 MD5 校验和。
Stream
上操作,但我认为这只会将创建流的问题暂时转移到另一个地方...难道我不需要检查如果流创建失败会发生什么,例如由于文件访问错误?那么我不是要测试如何处理这些问题吗? - royalTS