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);}}
Moq的一些基本用法的更多相关文章
- 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本 ...
- MVC 基本工具(Visual Studio 的单元测试、使用Moq)
3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的. ...
- Mock 框架 Moq 的使用
Mock 框架 Moq 的使用 Intro Moq 是 .NET 中一个很流行的 Mock 框架,使用 Mock 框架我们可以只针对我们关注的代码进行测试,对于依赖项使用 Mock 对象配置预期的依赖 ...
- .net程序单元测试介绍
什么是单元测试?为什么要进行单元测试?如需要进一步了解,请移步维基百科. 关于.net程序单元测试的文章,网上已经有很多,但我相信我写的这篇文章的内容是独特的,因为我在网上找了很久,都没找到关于Str ...
- Moq 和RhinoMocks
Moq & RhinoMocks 使用Mock对象进行测试一般都会有以下三个关键步骤: 使用接口来描述需要测试的对象 为实际的产品代码实现这个接口 以测试为目的,在Mock对象中实现这个接口 ...
- Moq & RhinoMocks
Moq & RhinoMocks 使用Mock对象进行测试一般都会有以下三个关键步骤: 使用接口来描述需要测试的对象 为实际的产品代码实现这个接口 以测试为目的,在Mock对象中实现这个接口 ...
- MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
我们在做单元测试的时候,常常困扰于数据的持久化问题,很多情况下我们不希望单元测试影响到数据库中的内容,而且受数据库的影响有时我们的单元测试的速度会很慢,所以我们往往希望将持久化部分隔离开,做单元测试的 ...
- 使用 Moq 测试.NET Core 应用 -- Mock 方法
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 本文介绍使用Moq来Mock方法. 使用的代码: https://git ...
- Moq 在.net Core 单元测试中的使用
Moq,主要用来伪造接口的实现类,实现方法,属性 moq The most popular and friendly mocking framework for .NET What? Moq (pro ...
随机推荐
- php-fpm进程管理方式(static和dynamic)
目前最新5.3.x的php-fpm,有两种管理进程的方式,分别是static和dynamic. 如果设置成static,进程数自始至终都是pm.max_children指定的数量,pm.start_s ...
- 如何适配处理iphoneX底部的横条 - ios
iphoneX手机取消了实体Home键,取而代之的是主界面底部不显眼的横条“Home Indicator”.当网页底部fixed 元素时候,一部分元素可能就被这个横条遮挡住,怎么适配解决呢? 第一步: ...
- pyspider 在ubuntu上安装失败怎么搞?
pyspider 是一个非常不错的爬虫框架,在ubuntu上安装时报错误: 很明显pycurl的问题,pycurl没安装成功 pycurl 安装错误解决办法: sudo apt-get install ...
- GUC-9 ReadWriteLock : 读写锁
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrit ...
- springboot之使用@ConfigurationProperties注解
springboot之使用@ConfigurationProperties注解 代码已经上传至github https://github.com/gittorlight/springboot-exam ...
- docker 安装错误Transaction Check Error
安装docker提示:Transaction Check Error: file /usr/bin/docker from install of docker-io-1.7.1-2.el6.x86_6 ...
- Windows下的Apache
https://blog.csdn.net/weixin_39082031/article/details/79088800
- Linux 常用基本命令及应用技巧
需要pdf 版 联系我 我的文件中有目录一.Linux 的常用基本命令................................................................. ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)J - 闯关的lulu
链接:https://www.nowcoder.com/acm/contest/67/J来源:牛客网 题目描述 勇者lulu某天进入了一个高度10,000,000层的闯关塔,在塔里每到一层楼,他都会获 ...
- 创建 python 虚拟环境
conda 创建环境 conda 可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理.包管理与 pip 的使用类似,环境管理则允许用户方便地安装不同版本的 python 并可以快速切 ...