在netcore出來之前的單元測試,調用每個接口都只需要遵循“調用方法,傳入參數”這個基本邏輯即可完成單元測試。
但是在使用ASP.Net Core 系列框架之后,開發人員廣泛使用依賴注入的方式來傳輸配置文件,或是某些依賴服務,這對於單元測試無疑是重大的障礙。因為Web項目的本體在原則上來講是不能將單元測試作為依賴項的,所以不方便進行依賴注入。
在這樣的背景之下,單元測試需要引入Mock一個概念。Mock的作用的是什么呢?就是模擬模仿依賴注入的內容,通過提前聲明的方式,來模擬程序調用到依賴注入的一些內容(包括配置文件,特定的實例等)
下面根據實際問題來進行學習一下:
//現在要對如下一個使用IConfiguration接口依賴注入的Service進行單元測試的編寫
public class DictionaryService : IDictionaryService
{
private IConfiguration _conf;
public DictionaryService(IConfiguration conf)
{
_conf = conf;
}
public string GetDic()
{
return _conf.GetSection("Dictionary").Value;
}
}
public class DicTest
{
private DictionaryService _serv = new DictionaryService(???);
//在示例化測試Service類的時候我們會發現要傳入一個IConfiguration接口的依賴注入,但是不方便去實現,要怎么辦呢?
}
在這種情況下我們就要用到moq.mock來實現對DictionaryService 用到的配置文件進行模擬,改為如下:
using Moq;
public class DicTest
{
private DictionaryService _serv;
public DictionaryTest()
{
//在Mock中傳入需要模擬的類型
var mockConf = new Mock<IConfiguration>();
//對於在方法中所有使用的到的實例化方法都需要進行模擬,並傳入返回值
mockConf.Setup(_ => _.GetSection("Dictionary").Value).Returns("this is a dic");
_serv = new DictionaryService(mockConf.Object);//最后再實例化DictionaryService類就可以了
}
}
基本上學會了使用這一套方法就可以模擬各種類型的依賴注入了,一招鮮吃遍天。
PS:其實做單元測試先要對代碼的運行邏輯,以及各種微服務都了解的情況下才方便進行依賴注入。