单元测试系统.io . filestream



有没有人知道我如何为包含FileStream的函数编写单元测试?

在您实际尝试测试的内容周围有更多的上下文将是有帮助的。您正在尝试解析流/写入流/其他东西吗?

最好的方法是让该函数使用Stream而不是FileStream。这样,在您的测试中,您可以使用内存流并为其提供所需的数据,而不必在文件系统上创建测试文件。这是有益的,因为您的测试将运行得更快,不依赖于机器状态,并且不需要有接触系统的Setup/Teardown代码。

一般来说,系统中应该有很少的组件应该直接与文件系统/数据库等通信。实际上,您需要的是一个流或更高级的对象,它恰好被持久化在某个文件中。

嗯,这不再是单元测试,而是集成测试,因为您依赖于外部系统=>文件系统。因此,您可以将文件的路径作为参数传递给方法,然后为测试项目重新创建一些示例文件,然后在这个文件上断言一些东西。您可以使用相对文件名,并将文件标记为Copy Always,以便为每个测试迭代部署它。

如果您使用这里所示的接口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;
    }
}

相关内容

最新更新