2016-02-24 46 views
0

我正在重構遺留代碼以使其(單元)可測試。我有兩個類實現相同的接口,如下所示。在其中一個類中,我對DirectoryEntry具有外部依賴性。我建議的處理方法是創建一個IDirectoryEntry接口,並將該目錄條目作爲參數傳遞給GetGroups方法。問題是這會破壞IMyInterface。挑戰使代碼可測試

什麼會更好的方式來重構此代碼?

public interface IMyInterface 
{ 
    List<string> GetGroups(); 
} 

public class MyFirstClass : IMyInterface 
{ 
    public List<string> GetGroups() 
    { 
     .. 
     var directoryEntry = new DirectoryEntry(path); 
     .. 
     return something; 
    } 
} 

public class MySecondClass : IMyInterface 
{ 
    public List<string> GetGroups() 
    { 
     return somethingElse; 
    } 
} 

問候, 弗蘭克

+0

你應該在目錄條目的提供商通過在構造函數中執行'IMyInterface'類。我不明白你建議的方式會是什麼樣子。 –

+2

你爲什麼要用類名加前綴? –

+0

在某些時候,你將會達到可以被嘲笑的極限。如果你創建一個包含'DirectoryEntry'的包裝來將它注入到這個代碼中,你將如何測試這個包裝?在'GetGroups'方法中是否有足夠的代碼來代表'DirectoryEntry'?你的代碼也不會顯示如何設置'path'變量。使用一組測試文件在您的測試項目中創建一個文件夾是否可行? –

回答

2

如果你只在你可能不希望將其作爲參數傳遞你的類的一個外部的依賴。 更好的方式是把它傳遞一個構造函數:

public class MyFirstClass : IMyInterface 
{ 
    private IDirectoryEntry _entryAccessor; 
    public MyFirstClass(IDirectoryEntry entryAccessor) 
    { 
     _entryAccessor = entryAccessor; 
    } 
    public List<string> GetGroups() 
    { 
     var directoryEntry = _entryAccessor.Do(path); 
     return something; 
    } 
}