---
# System prepended metadata

title: 單元測試 筆記
tags: [C#, Unit test, Back-end]

---

# 單元測試 筆記
單元測試是測試程式中的最小單位，一次只測試一件事情，主要用於確認某一邏輯是否符合開發者預期，在往後修改程式碼時能保證邏輯扔然符合當初預期。

單元測試應切開與外部資源連接(例如: 資料庫連線)，並能獨立執行測試。因為若測試沒有通過，能確保是邏輯有誤，而非外部的因素。常用Mock、Stub假物件來模擬與外部資源的互動，並只關注於我們要測試的邏輯的部分。

# Interface
在寫單元測試時，為了只單獨測試某一邏輯，會用到interface隔離與其他使用到的function的相依性，用Mock假物件建立一個與原程式相同的空殼子並去模擬其操作。

Interface會先建立一些方法，但還未真正實作。繼承這個介面的類別再去實作每一方法，故能以介面來隔離相依性，因為兩個類別是各別獨立實作各自的方法，只有介面的方法相同而已。

```
public interface I手機
{
    string 打電話(string 電話號碼);
    string 掛電話();
    string 調音量(int 音量大小);
    string 轉振動();
}
public class iphone4S : I手機
{
    public string 打電話(string 電話號碼)
    {
        Console.WriteLine("iOS打電話給"+ 電話號碼);
        return "撥號中";
    }

    public string 掛電話()
    {
        Console.WriteLine("iOS將通話中電話結束");
        return "結束通話";
    }

    public string 調音量(int 音量大小)
    {
        Console.WriteLine("iOS將音量調整為" + 音量大小);
        return "完成調音量";
    }

    public string 轉振動()
    {
        Console.WriteLine("iOS將轉振動");
        return "完成轉振動";
    }

    public string 呼叫Siri(string 指令)
    {
        //注意這是I手機沒有定義的方法
        return "Siri說" + 指令;
    }
}
```

# 參考資料
1. https://blog.miniasp.com/post/2010/09/16/ASPNET-MVC-Unit-Testing-Part-03-Using-Mock-moq
2. https://dotblogs.com.tw/hatelove/archive/2012/11/13/learning-tdd-in-30-days-day5-how-to-isolate-dependency-the-basic-testability.aspx
3. https://dotblogs.com.tw/initials/2016/06/18/102618

###### tags: `Back-end` `C#` `Unit test`