IO扩展控件(System.IO.Abstractions)

刚看到这个Namespace的时候还以为是.Net Framework里自带的包,结果查了一圈无任何结果。
果断上Github搜索,一击即中 https://github.com/tathamoddie/System.IO.Abstractions
先翻译下开发者给出的简单说明,今后再慢慢使用
类似于System.Web.Abstractions的用法,System.IO也被扩展了,它能针对可测的IO进行访问.
Just like System.Web.Abstractions, but for System.IO. Yay for testable IO access!
只能用NuGet方式下载
NuGet only:

1 Install-Package System.IO.Abstractions

如果有需要可以下载测试帮助包
and/or:

1 Install-Package System.IO.Abstractions.TestingHelpers

本库最核心的2个文件是IFileSystem和FileSystem。使用IFileSystem.File.ReadAllText等方法替换掉之前的File.ReadAllText等方法。除了一些我们扩展和进行测试的方法外,其他API也基本完全相同。
At the core of the library is IFileSystem and FileSystem. Instead of calling methods like File.ReadAllText directly, use IFileSystem.File.ReadAllText. We have exactly the same API, except that ours is injectable and testable.

 1 public class MyComponent  
 2 {  
 3     readonly IFileSystem fileSystem;  
 4    5     // <summary>Create MyComponent with the given fileSystem implementation</summary>   6     public MyComponent(IFileSystem fileSystem)  
 7     {  
 8         this.fileSystem = fileSystem;  
 9     }  
10     /// <summary>Create MyComponent</summary>  11     public MyComponent() : this(  
12         fileSystem: new FileSystem() //use default implementation which calls System.IO  13     )  
14     {  
15     }  
16   17     public void Validate()  
18     {  
19         foreach (var textFile in fileSystem.Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly))  
20         {  
21             var text = fileSystem.File.ReadAllText(textFile);  
22             if (text != "Testing is awesome.")  
23                 throw new NotSupportedException("We can't go on together. It's not me, it's you.");  
24         }  
25     }  
26 }

这个库中还包含了一系列测试程序,来帮助你熟悉它。虽然它不是一个成熟的文件系统,但是它一定会给你带来帮助的。
The library also ships with a series of test helpers to save you from having to mock out every call, for basic scenarios. They are not a complete copy of a real-life file system, but they'll get you most of the way there.

 1 [Test]  

 2 public void MyComponent_Validate_ShouldThrowNotSupportedExceptionIfTestingIsNotAwesome()  
 3 {  
 4     // Arrange   5     var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>  
 6     {  
 7         { @"c:\myfile.txt", new MockFileData("Testing is meh.") },  
 8         { @"c:\demo\jQuery.js", new MockFileData("some js") },  
 9         { @"c:\demo\image.gif", new MockFileData(new byte[] { 0x12, 0x34, 0x56, 0xd2 }) }  
10     });  
11     var component = new MyComponent(fileSystem);  
12   13     try  14     {  
15         // Act  16         component.Validate();  
17     }  
18     catch (NotSupportedException ex)  
19     {  
20         // Assert  21         Assert.AreEqual("We can't go on together. It's not me, it's you.", ex.Message);  
22         return;  
23     }  
24   25     Assert.Fail("The expected exception was not thrown.");  
26 }

我们甚至支持把.NET框架里不可测试的类型加入到测试程序里

We even support casting from the .NET Framework's untestable types to our testable wrappers:

 1 FileInfo SomeBadApiMethodThatReturnsFileInfo()  

 2 {  
 3     return new FileInfo("a");  
 4 }  
 5    6 void MyFancyMethod()  
 7 {  
 8     var testableFileInfo = (FileInfoBase)SomeBadApiMethodThatReturnsFileInfo();  
 9     //...  
 10 }