一千萬個為什麽

搜索

將System類作為構造函數參數傳遞

這可能很瘋狂。

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

但是我最終得到的File IO類只能通過集成測試進行測試,當然,這會引入我真正想要處理的復雜性,確保我的FileIO類調用正確的System.IO東西。我不需要集成測試System.IO。我的FileIO類不僅僅是簡單地包裝System.IO函數,它不時地包含一些邏輯(也許這就是問題?)。

所以我想要的是能夠測試我的File 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類是靜態類,因此不會出現這種情況。據我所知,他們既不能以這種方式實例化,也不能為了嘲笑而進行子類化。

最佳答案

創建一個包含簡單重定向到System.IO的函數的類。創建另一個偽造/模擬System.IO的類。這兩個類都實現了一個通用接口。然後你不必擔心System.IO充滿靜態的事實。

轉載註明原文: 將System類作為構造函數參數傳遞