iT邦幫忙

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

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

【Day 13】解除依賴之四:Mock 改寫我們的LogAnalyzer

上一篇文章,說明了什麼是mock,以及要如何區分stub和mock。這篇將會改寫我們LogAnalyzer


我們要測試,是否LogAnalyzer首先我們需要修改我們的程式流程,從取得檔案名稱,衍生至從網站中上傳檔案,然後取得檔名,再檢查檔案名稱,當檔名正確,回傳為true,否則為false。
所以變成:

**網頁上傳 -->...--> 檢查檔名是否為log檔 --> true / false**

然後使用mock後,會變成:

*「製作出網頁上傳的檔案名稱」--> 檢查檔名是否為log檔 --> true / false**

首先我們先製作屬於我們的主要功能與程式(Day13_LogAnalyzer

class Day13_LogAnalyzer
{
    private IWebService service;

    //structure: put the interface data to service.
    public Day13_LogAnalyzer(IWebService service)
    {
        this.service = service;
    }

    public void Analyze(string fileName)
    {
        if (!fileName.EndsWith(".log", StringComparison.CurrentCultureIgnoreCase))
        {
            service.LogMessage("false"); 
        }
        else
        {
            service.LogMessage("true");
        }
    }
}

#region Mock
//interface: Web service's message.
public interface IWebService
{
    void LogMessage(string message);
}

//A fake class.
public class FakeWebService : IWebService
{
    public string LastMessage;
    public void LogMessage(string message)
    {
        LastMessage = message;
    }
}
#endregion
  1. 先製作出簡單interfaceIWebService)裡面只有一個function。
  2. 接著做出一個fake的class,繼承IWebService。這個就是我們的mock的皮,這個很像是之前的stub。但是他卻沒有回傳值,多了點額外的功能,所以視為mock。
  3. 接著,實現mock對象和斷言(assert),下面的程式碼中實現。

接著是測試的程式(Day13_LogAnalyzer_Test

class Day13_LogAnalyzer_Test
{
    [Test]
    public void LogAnalyze_NameSupportedExtension_CallWebservice()
    {
        FakeWebService mokeSample = new FakeWebService();
        Day13_LogAnalyzer log = new Day13_LogAnalyzer(mokeSample);

        //log.Analyze("test_false.false");  //it will be error shows false
        log.Analyze("test_true.log");       //it will be ture shows true

        StringAssert.Contains("true", mokeSample.LastMessage);
    }
}
  1. 製作出Arrange(對象),實作出Fake物件,並且把這個物件,放入我們主要的程式class中。
  2. Act(動作),帶入的fake檔名是否正確。
  3. Assert(斷言),判斷我們預期的是否與結果相同。

最後結果成功!!(可以是看看錯誤的,會有怎樣的錯誤訊息)


明天製作出Stub和Mock一起使用的案例。


上一篇
【Day 12】解除依賴之三:Mock 模擬對象 說明
下一篇
【Day 14】解除依賴之五:Stub 和Mock 一起使用(待續)
系列文
【Unit Test】Unit Test with C#31

尚未有邦友留言

立即登入留言