我想为 Directory.GetFiles() 等方法编写单元测试,但它需要路径作为参数。我有一个包含 GetAllFiles 方法的接口,该方法在内部调用此方法。我把它模拟如下:
var mockFile = new Mock<IFileImplement>();
mockFile.Setup(_ => _.GetAllFiles(It.IsAny<string>())).Returns(new[] {"text1.txt", "text2.txt"});
但是,当我调用GetAllFiles方法来测试它时,应该输入什么路径?因为我不想让它检查实际目录,但我收到错误消息,找不到路径?
我认为,你应该创建mockFile并且可以编写单元测试。
var mockFile= new MockFileData(new byte[4])//内容为字节数组 var mockFileSystem = new MockFileSystem();
然后您应该将文件目录添加到文件系统(.AddDirectory(directory))并将文件添加到文件系统(.AddFile(directory,yourFileasbyteArray))
您需要关注 System.IO.Abstractions 。它绝对对你有帮助。 因此,您需要创建模拟文件和系统。
查看 System.IO.Abstractions,因为它已经创建了您想要的抽象。
话虽如此。他们的实现大致是创建带有接口的非静态类。目前,这些是唯一可以使用 Moq 这样的库进行模拟的方法。
我已经为“DateTime”库做了类似的解决方案,但由于大脑放屁而失败了。我不会完成该项目,因为 Microsoft 现在有一个 TimeProvider 类。
Nick Chapsa 有一个视频解释如果您喜欢这种格式,如何编写一个简单的界面。他还展示了如何使用 Microsoft 的 TimeProvider。
当我在上面写下“目前这些是唯一的方法...”时,它即将随着 C#12 中的 Interceptors 而改变。