2009-04-10 73 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."); 
    } 
} 
}