C#單元測試--如何使用moq.mock進行依賴注入
阿新 • • 發佈:2021-12-15
C#單元測試--如何使用moq.mock進行依賴注入
在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:其實做單元測試先要對程式碼的執行邏輯,以及各種微服務都瞭解的情況下才方便進行依賴注入。