.NET文件系统包装器库

时间:2009-04-10 15:56:03

标签: .net mocking

由于某种原因,我找不到一个,但是某人必须已经创建了一个.NET IO库包装器。我希望能够模拟对File.Exists等的调用,并且内置的静态方法不能很好地解决这个问题。

6 个答案:

答案 0 :(得分:10)

我在你的前几分钟发现SystemWrapper,但你的目的更好。

答案 1 :(得分:3)

所有好的答案,但它们都让我离开了我开始的地方 - 为我最终完成的每个项目重新创建某种IFileSystem。我最终在.NET库周围创建了一个通用的IFileSystem库,我可以在所有项目之间重用它。不是很好,但它现在有效。

答案 2 :(得分:2)

还有一个FileInfo class,它与静态方法的作用相同。

另一方面,您可能不希望模拟整个FileInfo类。相反,您希望将所有文件操作放在一个类中,然后从类中提取接口(描述公共方法),并使用该接口模拟执行的文件操作,不是微软认为应该在FileInfo类中的整个操作集。

答案 3 :(得分:1)

我在CodePlex上维护Jolt.NET项目,该项目包含一个库,可以为您生成此类接口及其实现。有关详细信息,请参阅Jolt.Testing库。

答案 4 :(得分:1)

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.");
    }
}
}

答案 5 :(得分:0)

而不是寻找包装整个文件系统的库。为什么不创建一个简单的IFileSystem接口并开始添加所需的方法。

你的应用程序的其余部分应该依赖于允许模拟的IFileSystem

你可以有一个实现只是调用.Net给你的静态方法,然后你的代码可以依赖于接口。