2012-07-11 39 views
1

我讀到「單元測試的藝術」atm和im在使用屬性傳遞接口時遇到了一些問題。本書陳述如下:「如果你想要參數是可選的,使用屬性getters/setters,這是定義可選參數的一種更好的方式,而不是爲每個依賴添加不同的構造函數到類。」單元測試,使用屬性傳遞接口

的屬性示例中的代碼如下:

public class LogAnalyzer 
{ 
    private IExtensionManager manager; 
    public LogAnalyzer() 
    { 
     manager = new FileExtensionManager(); 
    } 

    public IExtensionManager ExtensionManager 
    { 
     get { return manager; } 
     set { manager = value; } 
    } 

    public bool IsValidLogFileName(string fileName) 
    { 
     return manager.IsValid(fileName); 
    } 
} 

[Test] 
Public void 
IsValidFileName_NameShorterThan6CharsButSupportedExtension_ReturnsFalse() 
{ 
    //set up the stub to use, make sure it returns true 
    ... 
    //create analyzer and inject stub 
    LogAnalyzer log = new LogAnalyzer(); 
    log.ExtensionManager=someFakeManagerCreatedEarlier; 

    //Assert logic assuming extension is supported 
    ... 
} 

當/ I將如何使用此功能?我可以想到的唯一場景(這可能是錯誤的!)是,如果我在一個類中有兩種方法,

Method1()從配置文件中檢索數據庫連接字符串,並在檢索到的字符串中包含某種形式的檢查。

Method2()然後連接到數據庫並返回一些數據。這裏的檢查可能是返回的數據不是null?

在這種情況下,要測試Method1()我可以聲明一個實現IExtensionManager接口的存根,其中存根有一個字符串,它應該通過我在method1()中進行的任何錯誤檢查。

對於Method2(),我聲明瞭一個存根,它實現了接口,並在存根類中聲明瞭一個包含一些數據的數據表。編號然後使用屬性將其分配給私人經理變量,然後調用Method2?

以上可能是完整的BS,如果是這樣,如果有人會讓我知道和生病將其刪除,感謝它。

感謝

回答

0

地產注入用來改變對象的行爲被創建後。

順便說一句,你的代碼是緊耦合到FileExtensionManager,這是IExtensionManager的具體實現。你如何用默認管理器測試LogAnalyzer?使用構造函數注入爲對象提供依賴關係 - 這將使它們可測試:

public LogAnalyzer (IExtensionManager manager) 
{ 
    this.manager = manager(); 
} 
+0

嗨,代碼來自本書。關於您的評論「您將如何使用默認管理器測試LogAnalyzer?」我認爲每當創建一個LogAnalyzer的實例時,管理員最初都被設置爲默認值。只有在執行測試時,我纔會通過屬性更改它,或者我錯過了什麼? – 2012-07-11 10:53:30

+0

@HansRudel是的,經理被設置爲默認(這被稱爲窮人的依賴注入)。但是你需要用模擬經理來替換它來進行測試。如果在其他程序集中聲明瞭默認值,則不需要這種依賴關係 - 您將耦合到該程序集。當使用構造器注入時,使用DI框架注入管理器實例也更容易。使用窮人的注射不是「錯誤的」,但我更喜歡僅僅依賴抽象。 – 2012-07-11 11:17:24

+0

是否有可能在聊天室中有5分鐘的時間? (我沒有足夠的代表打開一個) – 2012-07-11 11:44:46