本篇會說明:模擬異常,和使用get、set注入虛擬對象
使用的範例是:Day11_LogAnalyzer_Test
做一個範例,使用一個偽造對象丟出異常。
當我們定義一個偽造的對象log.IsValidLogFileName("Test11.11day")
,並且把錯誤訊息寫上"this is fake"
當遇到問題的時候或是錯誤檔名的時候將會回傳false
[Test]
//增加錯誤的偽造對象來模擬異常
public void IsValidLogFileName_ExtManagerThrowsException_ReruensFalse()
{
//先設定錯誤訊息
FakeExtensionManager myFakeManager = new FakeExtensionManager();
myFakeManager.WillThrow = new Exception("this is fake");
//開始測試
LogAnalyzer log = new LogAnalyzer(myFakeManager);
bool result = log.IsValidLogFileName("Test11.11day");
//雖然說不使用也可以是false,那就不使用吧(此部分與書本不同)
Assert.False(result);
}
internal class FakeExtensionManager: IExtensionManager
{
public bool WillBeValid = false;
public Exception WillThrow = null;
public bool IsValid(string fileName)
{
if (WillThrow != null)
{
throw WillThrow;
}
return WillBeValid;
}
}
這個部分就是比較偏向觀念。
一般使用get
和set
,都是在設定值的時候。例如在C#中,可以使用public int price {get; set;}
的方式給予值。同樣的也可以用這個方法給予偽造對象。
例如在LogAnalyzer.cs
把其中的存取值得地方改成
public IExtensionManager ExtensionManager
{
get { return manager;}
set { manager = value;}
}
所以就在UT的地方把值直接寫入:
log.ExtensionManager = someFakeManagerByUs
其實做法跟一般的函數建構一樣,可以定義哪些依賴項目是必須的,而哪些是可選的。
所以通過這樣的使用,只是在宣稱**「這個類別,這個依賴項目並不是必須的」**
因此當使用的時候無論有沒有使用這個項目,都是對結果沒有影響。