C#单元测试--如何使用moq.mock进行依赖注入

Posted 野菊花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:其实做单元测试先要对代码的运行逻辑,以及各种微服务都了解的情况下才方便进行依赖注入。

以上是关于C#单元测试--如何使用moq.mock进行依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

如何对具有依赖项的工厂进行单元测试

如何使用构造函数依赖注入对 asp.net 核心应用程序进行单元测试

您如何在 C# 中模拟文件系统以进行单元测试?

如何对依赖于 RC3 路由器的组件进行单元测试?

在 C# 中对“不可测试”的应用程序进行自动化测试。单元/集成/功能/系统测试 - 如何?

2019最新Android中级面试题目汇总解答