利用 NSubstitute 實作 Mock 功能
在 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));
以上為簡單的範例,之後會再講解更複雜的用法。
參考資料