2012-08-30 51 views
0

我有以下的代碼,我想測試:如何編寫依賴文件系統事件的單元測試?

public class DirectoryProcessor 
{ 
    public string DirectoryPath 
    { 
     get; 
     set; 
    } 

    private FileSystemWatcher watcher; 

    public event EventHandler<SourceEventArgs> SourceFileChanged; 

    protected virtual void OnSourceFileChanged(SourceEventArgs e) 
    { 
     EventHandler<SourceEventArgs> handler = SourceFileChanged; 
     if(handler != null) 
     { 
      handler(this, e); 
     } 
    } 

    public DirectoryProcessor(string directoryPath) 
    { 
     this.DirectoryPath = directoryPath; 
     this.watcher = new FileSystemWatcher(directoryPath); 
     this.watcher.Created += new FileSystemEventHandler(Created); 
    } 

    void Created(object sender, FileSystemEventArgs e) 
    { 
     // process the newly created file 
     // then raise my own event indicating that processing is done 
     OnSourceFileChanged(new SourceEventArgs(e.Name)); 
    } 
} 

基本上,我想寫一個NUnit測試,將做到以下幾點:

  1. 創建一個目錄
  2. 設置一個DirectoryProcessor
  3. 寫一些文件到目錄(通過File.WriteAllText()
  4. 檢查DirectoryProcessor.SourceFileChanged已經ONC解僱e爲在步驟3中添加的每個文件。

我試過這樣做並在步驟3後添加Thread.Sleep(),但很難使超時正確。它正確地處理我寫入目錄的第一個文件,但不是第二個(並且超時設置爲60秒)。即使我能以這種方式工作,這似乎是編寫測試的可怕方式。

有沒有人有一個很好的解決這個問題?

回答

0

如果您正在尋找測試使用這個類我的回答是不相關的另一個對象。

當我寫單元測試來操作,我更喜歡使用ManualResetEvent的

單元測試將是這樣的:

 ... 
    DirectoryProcessor.SourceFileChanged+=onChanged; 
    manualResetEvent.Reset(); 
    File.WriteAllText(); 
    var actual = manualResetEvent.WaitOne(MaxTimeout); 
    ... 

時ManualResetEvent的是ManualResetEvent的和MaxTimeout一些時間跨度(我的建議總是使用超時)。 我們現在缺少「調用onChanged」:

 private void onChanged(object sender, SourceEventArgs e) 
    { 
      manualResetEvent.Set(); 
    }  

我希望這是有益

+0

謝謝!我不熟悉ManualResetClass!總的來說,我認爲文件系統嘲諷是進行單元測試的正確方法。我也喜歡寫這些更多的集成測試,讓我看看代碼是如何工作的。 – Vinay

2

通常,您關心的是測試與文件系統的交互,並且不需要測試實際執行操作的框架類和方法。

如果您在類中引入了抽象層,那麼您可以在單元測試中模擬文件系統,以驗證交互是否正確,而無需實際操作文件系統。

在測試之外,「真實」實現調用這些框架方法來完成工作。

是,理論上你需要集成測試的是「真實」的實施,但它應該在實踐中是低風險的,通過手工測試的幾分鐘沒有受到太大的變化,和可覈查的。如果您使用開源文件系統包裝器,它可能包含那些測試,以便您放心。

How do you mock out the file system in C# for unit testing?

+0

所以,在這裏你會推薦嘲諷了FileSystemWatcher類? – Vinay

相關問題