出于某些原因,我找不到一个.NET IO库的封装器,但一定有人已经创建了。我想能够模拟对File.Exists等函数的调用,而内置的静态方法并不适合这种场景。
还有一个FileInfo类,它和静态方法做的事情一样。
另一方面,您可能不想模拟整个FileInfo类。相反,您想将所有文件操作放入单个类中,然后从该类中提取一个接口(描述公共方法),并使用该接口来模拟您执行的文件操作,而不是Microsoft认为应该在FileInfo类中包含的全部操作。
所有的答案都不错,但它们都让我回到起点 - 为每个我要工作的项目重新创建某种IFileSystem。最终我创建了一个通用的IFileSystem库,基于.NET库,可以在我所有的项目中重复使用。虽然不是很好,但现在它能够正常工作。
https://github.com/tathamoddie/System.IO.Abstractions 允许您执行此操作(来自 github 的示例)
public class MyComponent
{
readonly IFileSystem fileSystem;
// <summary>Create MyComponent with the given fileSystem implementation</summary>
public MyComponent(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
/// <summary>Create MyComponent</summary>
public MyComponent() : this(
fileSystem: new FileSystem() //use default implementation which calls System.IO
)
{
}
public void Validate()
{
foreach (var textFile in fileSystem.Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly))
{
var text = fileSystem.File.ReadAllText(textFile);
if (text != "Testing is awesome.")
throw new NotSupportedException("We can't go on together. It's not me, it's you.");
}
}
}
我在 CodePlex 上维护 Jolt.NET 项目,其中包含一个库,可以为您生成这些接口及其实现。请参考 Jolt.Testing 库以获取更多信息。
不要寻找一个封装整个文件系统的库,为什么不创建一个简单的IFileSystem接口并开始添加您所需的方法。
应用程序的其余部分应该依赖于IFileSystem,这将允许模拟。
您可以拥有一个实现,它只是调用.Net给您的静态方法,然后您的代码可以依赖于这个接口。