有谁知道如何为包含FileStream的函数编写单元测试?
答案 0 :(得分:4)
有关您实际尝试测试的内容的更多背景信息会很有帮助。您是否正在尝试解析流/写入流/其他内容?
这里最好的选择是让该函数使用Stream而不是FileStream。这样,在测试中,您可以使用内存中的流并为其提供所需的数据,而不必在文件系统上创建测试文件。这是有益的,因为您的测试运行得更快,不依赖于机器状态,并且不需要具有触及系统的Setup / Teardown代码。
通常,系统中应该只有很少的组件应该直接与文件系统/数据库/等进行对话。你真正想要的是一个Stream或更高级别的对象,它恰好被保存在某个文件中。
答案 1 :(得分:1)
嗯,这不再是单元测试,而是集成测试,因为你依赖于外部系统=>文件系统。因此,您可以将参数作为参数传递给文件的路径,然后为测试项目重新创建一些示例文件,然后在此文件上断言。您可以使用相对文件名并将文件标记为“始终复制”,以便为每次测试迭代部署该文件。
答案 2 :(得分:0)
如果您使用此处显示的接口IDbFileIo,则可以使模拟内存流返回值而不是加载实际文件。
public interface IDbFileIo
{
MemoryStream LoadFile();
}
......实施
public MemoryStream LoadFile()
{
string databasePath = _pathInfo.GetFullDatabasePath();
using (FileStream fileStream = new FileStream(databasePath, FileMode.Open, FileAccess.Read))
{
MemoryStream memoryStream = new MemoryStream();
memoryStream.SetLength(fileStream.Length);
fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length);
return memoryStream;
}
}