如何在C#中模拟文件系统进行单元测试?

189

是否有任何库或方法可以在C#中模拟文件系统以编写单元测试?在我目前的情况下,我有一些方法来检查特定文件是否存在并读取其创建日期。将来我可能需要更多的功能。


1
这看起来像是其他几个问题的重复,包括:https://dev59.com/h3RB5IYBdhLWcg3wUFrB。 - John Saunders
也许可以尝试一下 Pex(http://research.microsoft.com/en-us/projects/pex/filesystem.pdf)。 - Tinus
2
@Mitch:大多数情况下,将数据放置在文件系统中并让单元测试运行即可满足要求。然而,我遇到了执行许多IO操作的方法,并且使用模拟文件系统可以极大地简化为这些方法设置测试环境的过程。 - Steve Guidi
我为此编写了https://github.com/guillaume86/VirtualPath(以及更多),它仍在进行中,API肯定会改变,但它已经可以工作,并且包含一些测试。 - Guillaume86
14个回答

1
创建接口并模拟测试是最清晰的方法。但是,作为替代方案,您可以看一下Microsoft Moles框架。

0

常见的解决方案是使用一些抽象的文件系统API(例如Java中的Apache Commons VFS):所有应用程序逻辑都使用API,单元测试能够使用存根实现来模拟真实的文件系统(内存仿真或类似方法)。

对于C#,存在类似的API:NI.Vfs,它与Apache VFS V1非常相似。它包含默认实现,包括本地文件系统和内存文件系统(后者可以直接在单元测试中使用)。


-1

我们目前使用专有的数据引擎,其API未公开为接口,因此我们几乎无法对我们的数据访问代码进行单元测试。然后我也采用了Matt和Joseph的方法。


-2
我会选择Jamie Ide的回答。不要试图模拟你没有编写的东西。可能会有各种你不知道的依赖关系,如密封类、非虚方法等。
另一种方法是使用可模拟的东西包装适当的方法。例如,创建一个名为FileWrapper的类,允许访问File方法,但是可以模拟出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接