iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0
Software Development

【Unit Test】Unit Test with C#系列 第 11

【Day11】去除依賴之二-Stub 2

本篇會說明:模擬異常,和使用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注入虛擬對象

這個部分就是比較偏向觀念。
一般使用getset,都是在設定值的時候。例如在C#中,可以使用
public int price {get; set;}的方式給予值。同樣的也可以用這個方法給予偽造對象。
例如在LogAnalyzer.cs把其中的存取值得地方改成

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

所以就在UT的地方把值直接寫入:

log.ExtensionManager = someFakeManagerByUs

其實做法跟一般的函數建構一樣,可以定義哪些依賴項目是必須的,而哪些是可選的。
所以通過這樣的使用,只是在宣稱**「這個類別,這個依賴項目並不是必須的」**
因此當使用的時候無論有沒有使用這個項目,都是對結果沒有影響。


上一篇
【Day10】解除依賴:Stub之一
下一篇
【Day 12】解除依賴之三:Mock 模擬對象 說明
系列文
【Unit Test】Unit Test with C#31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言