2008-12-16 94 views
4

我有一個方法,我想單元測試有文件系統調用,並且想知道如何去做。我看過Unit testing code with a file system dependency,但它不回答我的問題。包含文件系統調用的單元測試方法

我用於測試的方法看起來是這樣的(C#)

public void Process(string input) 
{ 
    string outputFile = "output.txt"; 
    this.Transform(input, Resources.XsltFile, outputFile); 
    if ((new FileInfo(outputFile)).Length == 0) 
    { 
     File.Delete(outputFile); 
    } 
} 

我嘲諷的變換(..)方法,以正常輸出到文件,因爲我單元測試過程的方法,而不是轉換(..)方法,因此不存在output.txt文件。因此,如果檢查失敗。

我該如何正確地做到這一點?我是否應該在文件io方法上創建某種包裝類型,我也會模擬出來?

回答

0

我認爲你應該創建兩個文件:一個長度爲零,另一個包含一些數據。 然後,你應該對每個文件進行測試。在準備階段,您應該將給定的文件複製到一個測試目錄中,運行測試,並在文件存在之後聲明。

5

編輯我回答你加入C#的問題之前(或我錯過了...),所以我的答案是一個小的Java式的,但原理是一樣的...


你對文件IO封裝的想法是一個不錯的選擇。這是一個這樣的例子,但類似的話可以這樣做:

interface FileProvider { 
    public Reader getContentReader(String file); 
     // notice use of the Reader interface 
     // - real-life returns a FileReader; 
     // - testing mock returns a StringReader; 


    public FileInfo getFileInfo(String path); 
     // easy to mock out... 
} 

class Processor { 

    private FileProvider fileProvider; 

    public void setFileProvider(FileProvider provider) { 
     this.provider = provider; 
    } 

    public void process(String input) { 
     // use this.fileProvider for all filesystem operations... 
    } 
} 

這是dependency injection一個例子 - 爲使事情容易測試的一個共同的模式:

  • 在測試的時候,你可以用嘲諷像NMock這樣的框架來嘲笑測試FileProvider的實現;

  • 在運行時你只需插入真正的實現。

相關問題