1. 程式人生 > 其它 >C#單元測試--如何使用moq.mock進行依賴注入

C#單元測試--如何使用moq.mock進行依賴注入

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:其實做單元測試先要對程式碼的執行邏輯,以及各種微服務都瞭解的情況下才方便進行依賴注入。