2010-04-16 222 views
1

這可能是瘋狂的。傳遞系統類作爲構造函數參數

我想把依賴注入的想法變爲極端。我已將所有與System.IO有關的行爲隔離到一個類中,以便我可以在其他類中嘲笑該類,從而減輕我的更大的單元測試套件對擔心實際文件系統的負擔。

但文件IO類我最終只能與集成測試,測試which-- course--的增加了複雜性我真的不希望處理當所有我真正想要做的就是確保我的FileIO類調用正確的System.IO東西。我不需要集成測試System.IO。我的FileIO類不僅僅是簡單地包裝System.IO函數,現在它每次都包含一些邏輯(也許這就是問題所在)。

所以我想是能夠測試我的文件IO類,以確保它使通過嘲諷System.IO類本身正確的系統調用。理想情況下,這將是那麼容易,因爲有像這樣一個構造函數:

public FileIO(
     System.IO.Directory directory, 
     System.IO.File file, 
     System.IO.FileStream fileStream 
    ) 
    { 
     this.Directory = directory; 
     this.File = file; 
     this.FileStream = fileStream; 
    } 

然後在類似的方法調用:

public GetFilesInFolder(string folderPath) 
    { 
     return this.Directory.GetFiles(folderPath) 
    } 

但這個因爲有關System.IO類不飛是靜態的類。據我所知,它們既不能以這種方式實例化,也不能爲了嘲弄而被分類。

回答

5

創建一個包含簡單重定向到System.IO的函數的類。製作另一個僞造/嘲笑System.IO的課程。這兩個類都實現了一個通用接口。那麼你不必擔心System.IO充滿靜態的事實。

1

每當你想從框架保護自己,你不希望在你的設計內部的東西,簡單的寫一個理想的接口,你想要它。意思是說,如果你只需要File.Exists(),File.Delete()和File.OpenRead(),然後編寫一個簡單的接口,只有你實際需要這些方法。

之後,你寫的周圍,實現你的接口,併成功地隱藏你試圖讓遠離框架咕實際的框架實現一個包裝類。

我做這與大多數的用戶通過靜態變量訪問的HttpContext東西帶點項目。你可以看到這個在這裏一個例子:

http://github.com/dotless/dotless/blob/master/src/dotless.Core/Abstractions/IResponse.cs

IResponse是我的簡單的界面,不正是我需要做的。 CssResponse中的代碼可以通過集成測試進行測試,但現在我只是假設它可以工作,因爲我從來沒有碰過它,它非常簡單。無論何時我需要使用IResponse接口來測試一個類時,我只需注入一個模擬對象或一個假的對象。

問候丹尼爾

相關問題