2012-06-22 84 views
6

到目前爲止,我創建了以下接口:如何模擬DirectoryInfo類?

public interface IDirectoryInfoWrapper 
    { 
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType); 
    public IDirectoryInfoWrapper[] GetDirectories(); 
    } 

我已經經歷的代碼IDirectoryInfoWrapper更換的DirectoryInfo。一切都順利,直到我發現這一點:

// Check that the directory is valid 
    DirectoryInfo directoryInfo = new DirectoryInfo(argPath); 
    if (directoryInfo.Exists == false) 
    { 
    throw new ArgumentException 
     ("Invalid IFileFinder.FindFiles Directory Path: " + argPath); 
    } 

這是沒有意義的把構造函數的接口,所以我應該怎麼做這行代碼:

DirectoryInfo directoryInfo = new DirectoryInfo(argPath); 
+0

界面做類似的,當然,去wihtout構造,但其與構造函數實現。 –

回答

5

我看到兩個明顯選擇:

  1. 用自己的包裝實現更換DirectoryInfo有(不理想)
  2. 創建一個工廠,可以使IDirectoryInfoWrapper實例。你可以爲你想要使用的每個構造函數重載一個Create函數。

我假設你正在用依賴注入來做這個,這意味着你現在只需將該工廠注入任何需要創建新目錄信息對象的類。

而且,你想修改包裝界面,以暴露Exists財產

編輯:如果你正在做這個嘗試單元測試的東西(這很可能),那麼你可以嘗試閱讀Misko Hevery。每次使用new運營商在C#中的時候,你有一個點,你不能在運行時注入一些東西。這使得使用new在任何情況下都很難測試任何東西。對於任何不是簡單數據對象的東西,我幾乎總是使用工廠。

編輯II

你委託建設的工廠,所以這就是你使用DirectoryInfo真正的構造函數:

class Factory : IFactory 
{ 
    IDirectoryInfoWrapper Create(string arg) 
    { 
    var dirInfo = new DirectoryInfo(arg); 
    var wrapper = new DirectoryInfoWrapper(dirInfo); 
    return wrapper; 
    } 
} 
+0

爲什麼#1不理想? –

+0

你還是會使用真實'DirectoryInfo'對象,只是一個間接層。如果你正在使用這個類(我假設)編寫單元測試,那麼現在你必須創建目錄來測試它。與文件系統交互的單元測試是一個糟糕的主意,所有類型的問題都可能出現,因爲您沒有真正控制文件系統。 –