需要:.NET 中的文件系統介面和實現
可能重複:
我使用 Moq 作為模擬框架為我的程式碼編寫單元測試。
我的程式碼包括對文件系統的呼叫,使用對
System.IO類的直接呼叫。例如,File.Exists(...)等等。我想將該程式碼更改為更具可測試性,所以我應該有一個介面,比如說
IFile,以及一個相關的方法,比如說Exists(string path) 。我知道我可以從頭開始編寫它,但我認為也許有一個完整、健壯的框架,它同時具有文件系統的介面和實現。這個(期望的)框架也可能是某種“服務”,因此它的 API 不必是
System.IO命名空間的“介面等價物”。請注意,我真的很想擁有介面(而不是靜態方法),這樣我的程式碼就可以進行依賴注入了
到目前為止我得到了什麼:
- 在stackoverflow中提出了一個類似但不相同的問題
- 在codeplex.com中有一個名為CodePlex Source Control Client (連結) 的項目,它的原始碼中有這樣的類(
/Source/TfsLibrary/Utility/具體細節請參見原始碼)還有其他建議嗎?
我已經為靜態
System.IO.File和Directory方法編寫了適配器。然後在我的課程中,我執行以下操作:public class MyService { public IFile File {private get;set;} public MyService() { File = new FileImpl(); } public void DoSomething() { File.ReadAllText("somefile"); } }然後你可以注入一個模擬作為 IFile 進行測試。
好吧,我沒有您想要的文件系統模擬庫(儘管它可能在某個地方並且很酷),但這可能會有所幫助。單元測試思想的“行為主義者”學派提出的有趣概念之一是“傳出介面”的概念。在某些情況下,將一個對像對自身之外的整個事物進行呼叫並將它們轉換為介面,這似乎與為外部方法創建介面的典型行為一樣有價值世界可以呼叫你的對象)。
在這種情況下,您可能會考慮,而不是模擬整個文件系統,而是為您的對像從外部世界需要的答案和服務創建一個或多個邏輯一致的介面。這些電話只會回答您需要回答的問題……而不是要求實施。然後,您可以使用前面提到的依賴注入來注入測試所需的實現。由於您熟悉 Moq,因此您可能會使用 Moq 來執行此操作。
因此,您的“傳出介面”可能有一個名為 DoesFileExist() 的方法。它可能會接受一條路徑。或者,如果您的對象試圖回答“更高級別”的業務問題,並且查看文件是否存在只是回答該問題的方式,那麼您的傳出介面可能根本沒有關於文件存在的方法。相反,它可能類似於“DoIAppearToHaveAccessToTheFileServer”,甚至是“IsThereAPreviouslySavedGame”。
這是一些工作,但可能更符合良好單元測試的原則……讓您的被測對象表達它想要做什麼,並讓您的單元測試只測試它。只是一個想法……希望它有所幫助。