2012-04-19 80 views
5

如果我有這樣的事情:你怎麼嘲笑對象的靜態方法

static class ManifestGenerator 
{ 
    public static void GenerateManifestFile(){ 
    var doc = new XDocument(); 
    ... 
    ... xml stuff added to doc 
    ... 
    doc.Save(manifestFilePath) 
} 

現在你能告訴我怎樣才能創建單元測試,這將確保該方法生成正確的XML? 我怎樣才能嘲笑XDocument(我正在使用Moq),而無需在方法調用中添加其他參數

回答

6

不要試圖模擬XDocument。這不是問題 - 這是對文件系統的訪問很煩人。你可以通過在Stream到清單中寫來代替:

public static void GenerateManifestFile(Stream output) { 
    var doc = new XDocument(); 
    ... 
    ... xml stuff added to doc 
    ... 
    doc.Save(output); 
} 

然後你可以測試與MemoryStream,但使用FileStream在現實清單路徑。你甚至可以使用此法內部(使用[InternalsVisibleTo],所以你仍然可以從測試中訪問),然後沿的線條一個公共的無參數過載:

using (Stream output = File.OpenWrite(manifestFilePath)) 
{ 
    GenerateManifestFile(output); 
} 

然後,您可以不考代碼,但你可以測試你所有的真實邏輯。

+0

+1:將它拆分成公共方法中的「使用」部分+內部工作人員是非常好的提示。 – 2012-04-19 19:32:47