我讀到「單元測試的藝術」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,如果是這樣,如果有人會讓我知道和生病將其刪除,感謝它。
感謝
嗨,代碼來自本書。關於您的評論「您將如何使用默認管理器測試LogAnalyzer?」我認爲每當創建一個LogAnalyzer的實例時,管理員最初都被設置爲默認值。只有在執行測試時,我纔會通過屬性更改它,或者我錯過了什麼? – 2012-07-11 10:53:30
@HansRudel是的,經理被設置爲默認(這被稱爲窮人的依賴注入)。但是你需要用模擬經理來替換它來進行測試。如果在其他程序集中聲明瞭默認值,則不需要這種依賴關係 - 您將耦合到該程序集。當使用構造器注入時,使用DI框架注入管理器實例也更容易。使用窮人的注射不是「錯誤的」,但我更喜歡僅僅依賴抽象。 – 2012-07-11 11:17:24
是否有可能在聊天室中有5分鐘的時間? (我沒有足夠的代表打開一個) – 2012-07-11 11:44:46