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 ...
随机推荐
- 由结构体成员地址计算结构体地址——list_entry()原理详解
#define list_entry(ptr, type, member) container_of(ptr, type, member) 在进行编程的时候,我们经常在知道结构体地址的情况下,寻找其中 ...
- 【LOJ】#2340. 「WC2018」州区划分
题解 学习一个全世界人都会只有我不会的东西 子集变换! 难道我要把这题当板子讲?等等这题好像是板...WC出板题好刺激啊= = 假装我们都做过HAOI2015的FMT题,我们都知道一些FMT怎么解决或 ...
- 【Java】 int与String类型间的相互转化
public class Test { public static void main(String[] args) { /* * int类型转String类型 */ int n1 = 9; //1. ...
- 14个你可能不知道的JavaScript调试技巧
调试JS的时候,搜索一下这个标题
- iview-cli 项目、iView admin 跨域问题解决方案
在build 目录的 webpack.dev.config.js 目录中 module.exports = merge(webpackBaseConfig, { devtool: '#source-m ...
- springmvc遇见406错误的问题分析
如果springmvc遇到406错误: 90%没有加入Jackson的包 10%因为后缀为.html 10%的情况,解决方案为加多一个映射,使用.action
- idea集成项目管理工具 --- Maven 并且【配置tomcat】
介绍: 1.项目管理工具 POM Porject Object Model 2.可以管理项目中的的jar包依赖 3.maven jar包中央仓库:http://mvnrepository.c ...
- 机器学习之路: python 支持向量机 LinearSVC 手写字体识别
使用python3 学习sklearn中支持向量机api的使用 可以来到我的git下载源代码:https://github.com/linyi0604/MachineLearning # 导入手写字体 ...
- bootbox弹出框插件
具体用法查看官网http://bootboxjs.com/examples.html {% load staticfiles %} <!DOCTYPE html> <html lan ...
- ThinkPHP3.2设置异常页面404跳转页面
在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面,类如下图: 0 «上一篇:div非弹出框半透明遮罩实现全屏幕遮盖css实现»下一篇:利于反向代理绑定任意的域名 po ...