在 ASP.NET Core 中,裡面已經內建了 DI,在某種程度上做測試會方便很多。普遍上的架構,在對於資料庫存取,會做一個 Respoitory,然後再包一層 Service,也由於 DI 的關係,基本上一定都會繼承 Interface,在測試上,就可以利用 Mock 來做。

本篇文章會示範 NSubstitute 這個 mocking library 的用法,讓讀者了解怎麼做 Mock。

安裝

安裝非常簡單,利用 nuget 搜尋 “NSubstitute” 後,直接安裝即可。

簡單的範例

當你的 Service 只具簡單的回傳值時,可以這樣寫:

public interface IService
{
    int GetIntValue();
    int GetIntValue(int arg);
    void DoSomeThing();
    string GetStrValue { get; set; }
}

IService service= Substitute.For<IService>();
service.GetIntValue().Returns(9);
service.GetIntValue(3).Returns(10);
Console.WriteLine($"none arg: {service.GetIntValue()}");
Console.WriteLine($"arg 3: {service.GetIntValue(3)}");
Console.WriteLine($"arg 4: {service.GetIntValue(4)}");

如果是設定 property,也是很簡單:

IService service= Substitute.For<IService>();
service.GetStrValue.Returns("aaa3");
service.GetStrValue = "aaa3";

如果想要複雜一點,例如說根據參數的不同回傳不同的值,可以這樣寫:

IService service= Substitute.For<IService>();
service.GetIntValue(Arg.Any<int>()).Returns(x => (int)x[0] * 10);
Console.WriteLine(service.GetIntValue(3));

以上為簡單的範例,之後會再講解更複雜的用法。

參考資料