.NET使用Moq进行单元测试_实用技巧

来源:脚本之家  责任编辑:小易  

本篇体验Moq的一些基本用法。首先通过NuGet安装Moq。

模拟方法的返回值

    public class HelperClass
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.Setup(x => x.IsEnabled()).Returns(true);
            Assert.AreEqual(mock.Object.IsEnabled(),true);
        }
    }
Moq模拟的方法一般是virtual虚方法,接口方法mock.Object是指HelperClass的实例

模拟方法后执行回调函数

   [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            string temp = "";
            var mock = new Mock<HelperClass>();
            mock.Setup(x => x.IsEnabled()).Returns(true).Callback(() => { temp = "success"; });
            Assert.AreEqual(mock.Object.IsEnabled(),true);
            if (temp == "success")
            {
                //TODO
            }
        }
    }
执行Return方法后,执行Callback回调方法,接收的参数类型是委托

模拟方法依次返回多个值

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.SetupSequence(x => x.IsEnabled())
                .Returns(true)
                .Returns(false);
            
            Assert.AreEqual(mock.Object.IsEnabled(),true);
            Assert.AreEqual(mock.Object.IsEnabled(), false);
        }
    }
SetupSequence方法可以为方法返回多个值

如果把以下2句:

Assert.AreEqual(mock.Object.IsEnabled(),true);
Assert.AreEqual(mock.Object.IsEnabled(), false);

颠倒一下顺序,变成:

Assert.AreEqual(mock.Object.IsEnabled(), false);
Assert.AreEqual(mock.Object.IsEnabled(),true);

结果,测试不通过。因为SutupSequence返回方法返回值的时候是有顺序的。

模拟第二次调用方法返回异常

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.SetupSequence(x => x.IsEnabled())
                .Returns(true)
                .Throws(new Exception());
            
            Assert.AreEqual(mock.Object.IsEnabled(),true);
            Assert.AreEqual(mock.Object.IsEnabled(), true);
        }
    }
通过Throws方法,在第二次调用IsEnable()方法时抛出异常。

直接返回被模拟方法的原始返回值

    public class HelperClass
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.CallBase = true;
            mock.SetupSequence(x => x.IsEnabled())
                .CallBase();
            Assert.AreEqual(mock.Object.IsEnabled(), true);
        }
    }

在被模拟的HelperClass类中,IsEnabled方法内部抛出异常。当把Moq实例的CallBase属性设置为true,并调用CallBase方法,可在测试方法中直接返回被模拟类中方法的原始返回值。

模拟泛型类

    public class HelperClass<T> where T : class 
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    public class Sample{}
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass<Sample>>();
            mock.SetupSequence(x => x.IsEnabled()).Returns(true);
            Assert.AreEqual(mock.Object.IsEnabled(), true);
        }
    } 

到此这篇关于.NET使用Moq进行单元测试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持真格学网。

您可能感兴趣的文章:.Net使用Xunit工具进行单元测试.NET Core单元测试的两种方法介绍ASP.NET?Core项目使用xUnit进行单元测试xUnit 编写 ASP.NET Core 单元测试的方法详解.Net单元测试方法ASP.NET Core中使用xUnit进行单元测试moq 的常用使用方法(推荐)

  • 本文相关:
  • system.web中不存在类型或命名空间名称“optimization”(是否缺少程序集引用?)
  • asp.net repeater 自递增
  • asp.net button 绑定多个参数
  • asp.net mvc分页和排序功能实现
  • c#设置本地网络如dns、网关、子网掩码、ip等等
  • .net core中object pool的多种用法详解
  • gridview分页的实现以及自定义分页样式功能实例
  • webapi 实现前后端分离的示例
  • 编译?dotnet和aspnetcore?源代码详情
  • .net core webapi中如何实现多态数据绑定实例代码
  • 求教:MOQ 和 MCQ 各是什么意思
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net.net使用xunit工具进行单元测试.net core单元测试的两种方法介绍asp.net?core项目使用xunit进行单元测试xunit 编写 asp.net core 单元测试的方法详解.net单元测试方法asp.net core中使用xunit进行单元测试moq 的常用使用方法(推荐)system.web中不存在类型或命名空间名称“optimization”(是否缺少程序集引用?)asp.net repeater 自递增asp.net button 绑定多个参数asp.net mvc分页和排序功能实现c#设置本地网络如dns、网关、子网掩码、ip等等.net core中object pool的多种用法详解gridview分页的实现以及自定义分页样式功能实例webapi 实现前后端分离的示例编译?dotnet和aspnetcore?源代码详情.net core webapi中如何实现多态数据绑定实例代码未将对象引用设置到对象的实例 (system.nullrefjava正则表达式 pattern和matcherasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它的某一个依赖项。试图加载格asp.net中的几种弹出框提示基本实现方法asp.net“服务器应用程序不可用” 解决方法asp.net gridview 72般绝技asp.net生成excel并导出下载五种实现方法system.runtime.interopservicesasp.net对路径"xxxxx"的访问.net core系列之memorycache 缓存域asp.net core mvc压缩样式、脚本详解identityserver4 quckstart 授权与自定义claimsasp.net gridview控件中模板列checkbox全选、反选、取消经典算法:基数排序的小例子asp.net5中用户认证与授权(2)asp.net 页面回跳实现代码.net非托管资源的回收方法.net 获取浏览器cookie(包括httponly)实例分享asp.net中的几种弹出框提示基本实现方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved