2009-04-10 49 views
8

出于某种原因,我找不到一个,但有人必须已经创建了一个.NET IO库包装。我想能够模拟对File.Exists等的调用,而静态方法内置并不能很好地解决这个问题。.NET文件系统包装库

+0

解释一下你的意思是“建在静态方法不适合好这一点。”你在寻找哪些.NET不提供的功能? – 2009-04-10 15:59:21

+2

依赖注入,嘲讽和其他任何很难用静态方法和类 – leora 2009-04-10 16:08:40

回答

2

还有一个FileInfo class,它做同样的事情,静态方法。

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

0

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

您的应用程序应该依赖于IFileSystem的其余部分,这将允许嘲弄

你可以有一个实现简单地调用静态方法,净给你,然后你的代码可以依赖的接口。

+3

这是我在过去所做的那样,但我厌倦了不断重新产生在每一个项目我工作的这个接口。寻找一个小代码在这里重复使用。 – Sneal 2009-04-10 16:34:48

3

所有很好的答案,但他们都离开了我,我开始 - 重建某种IFileSystem的每一个项目我结束了工作。我最终创建了一个围绕.NET库的通用IFileSystem库,我可以在所有项目之间使用该库。不是很好,但它现在起作用。

1

我保持在CodePlex上的Jolt.NET项目,该项目包含一个库来产生这样的接口和他们为你实现。有关更多信息,请参阅Jolt.Testing库。

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