是否有任何库或方法可以在 C# 中模拟文件系统来编写单元测试?在我目前的情况下,我有一些方法可以检查某个文件是否存在并读取创建日期。将来我可能需要更多。
编辑:安装 NuGet 包System.IO.Abstractions。
System.IO.Abstractions
最初接受此答案时,此软件包不存在。原始答案是针对以下历史背景提供的:
你可以通过创建一个接口来做到这一点: interface IFileSystem { bool FileExists(string fileName); DateTime GetCreationDate(string fileName); } 并创建一个使用 System.IO.File.Exists() 等的“真实”实现。然后您可以使用模拟框架模拟此接口;我推荐起订量。 编辑:有人这样做了,请在这里在线发布。 我已经使用这种方法在 IClock 接口中模拟了 DateTime.UtcNow(对于我们的测试能够控制时间流真的非常有用!),更传统的是,ISqlDataAccess 接口。 另一种方法可能是使用TypeMock,这允许您拦截对类的调用并将它们存根。然而,这确实要花钱,并且需要安装在整个团队的 PC 和构建服务器上才能运行,而且它显然不适用于 System.IO.File,因为它不能存根 mscorlib。 您也可以接受某些方法不可单元测试,并在单独的缓慢运行的集成/系统测试套件中对其进行测试。
你可以通过创建一个接口来做到这一点:
interface IFileSystem { bool FileExists(string fileName); DateTime GetCreationDate(string fileName); }
并创建一个使用 System.IO.File.Exists() 等的“真实”实现。然后您可以使用模拟框架模拟此接口;我推荐起订量。
编辑:有人这样做了,请在这里在线发布。
我已经使用这种方法在 IClock 接口中模拟了 DateTime.UtcNow(对于我们的测试能够控制时间流真的非常有用!),更传统的是,ISqlDataAccess 接口。
另一种方法可能是使用TypeMock,这允许您拦截对类的调用并将它们存根。然而,这确实要花钱,并且需要安装在整个团队的 PC 和构建服务器上才能运行,而且它显然不适用于 System.IO.File,因为它不能存根 mscorlib。
您也可以接受某些方法不可单元测试,并在单独的缓慢运行的集成/系统测试套件中对其进行测试。