Moq 在.net Core 单元测试中的使用
Moq,主要用来伪造接口的实现类,实现方法,属性
moq
The most popular and friendly mocking framework for .NET
What?
Moq (pronounced "Mock-you" or just "Mock") is the only mocking library for .NET developed from scratch to take full advantage of .NET Linq expression trees and lambda expressions, which makes it the most productive, type-safe and refactoring-friendly mocking library available. And it supports mocking interfaces as well as classes. Its API is extremely simple and straightforward, and doesn't require any prior knowledge or experience with mocking concepts.
Github:https://github.com/moq/moq4
在线方法MSDN文档:
http://www.nudoq.org/#!/Packages/Moq/Moq/Moq
http://www.nudoq.org/#!/Packages/Moq/Moq/It
常用方法汇总:
定义Mock对象
1.new Mock<IFoo>();
设置mock对象返回值,返回固定值或者ThrowException
1.mockInstance.SetUp().Returns()
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
2.mockInstance.SetUpSet()
mock.SetupSet(s => s.Name = "zhangsan");
3.mockInstance.SetupProperty() SetupProperty方法返回mockInstance对象,可以继续.方法,方便多次设置
mock
.SetupProperty(f => f.Name, "haha")
.SetupProperty(f => f.Add(6), false)
.SetupProperty(f => f.Bar, new Bar());
CallBack 可以设置回调函数,执行回调输出
mock.Setup(foo => foo.GetCount())
.Returns(() => calls)
.Callback(() => calls++);
It静态类的用法:
Moq 关于It类的文档: http://www.nudoq.org/#!/Packages/Moq/Moq/It
它有下面几种用法:
- Is<TValue>(Expression<Func<TValue, Boolean>>)
- IsAny<TValue>()
- IsIn<TValue>(IEnumerable<TValue>)
- IsInRange<TValue>(TValue, TValue, Range)
- IsNotIn<TValue>(IEnumerable<TValue>)
- IsNotNull<TValue>()
- IsRegex(string)
It.isAny<type>(); 返回制定类型的任意数值
It.is<string>(condition c) 输入制定条件,返回满足条件的制定类型数据
It.Ref<type>.IsAny 返回ref 类型的 type 实例
It.IsInRange<type>(from f,to t,enumType) 返回制定类型的from-to的数据,常用语int类型,数值类型
It.IsRegex("[a-d]",RegeOption.IgnoreCase) 正则表达式,生成字符串.
其他高级用法:
在创建Mock对象的时候, 还可选传递一个MockBehavior这个参数.
MockBehavior是一个枚举, 它有三个值:
- MockBehavior.Strict, 如果mock对象上的方法没有被预先设置好, 那么测试中调用该方法的时候就会抛出异常.
- MockBehavior.Loose, 即使方法没有被预先设置, 调用它的时候也不会抛出异常. 它会返回该方法返回类型的默认值.
- MockBehavior.Default, 它代表MockBehavior.Loose.
Mock.Of()
Mock.Get()
确认方法被调用(Verify)
创建一个新的测试方法:
与状态测试不同, 这里我不使用Assert, 我是用的是mock.Verify() 来判定其参数里的方法会被执行. 在这里也可以使用It类进行参数匹配.
该测试会通过, 表示IsHealthy确实被执行了:
如果我改变一下Verify里IsHealthy()方法的参数范围:
那么针对此例, 测试就会失败:
这是因为IsHealthy()方法被调用时的参数与我所期待的参数不一致.
自定义错误信息
这时, 我们可以使用另一个重载版本的Verify()方法, 它可以添加一个错误信息的参数:
这时测试失败的信息如下:
此外通过重载方法, 还可以判断方法被调用的次数
方法被调用次数
还是用到了Verify的重载方法和Times这个struct.
1. 没被调用:
2. 被调用1次:
3. 被调用特定次数:
Times这个struct里面还有很多选项, 请自行摸索.
确认属性访问
首先是Get.
与之前调用的Verify()不同, 针对属性, 需要使用VerifyGet()方法来确保属性被访问了:
这个测试会通过, 因为这个属性确实被访问了:
检查另一个没有被访问的属性:
那么结果就会失败:
下面是Set.
很简单, 使用VerifySet()方法即可. 再创建一个测试方法:
在VerifySet方法里需要设定被Set的属性以及被Set的值.
针对此例, 这个测试会通过:
但是如果Set的值不正确, 测试就会失败:
Moq 在.net Core 单元测试中的使用的更多相关文章
- Asp.Net Core 单元测试正确姿势
背景 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,并且默认注入了很多服务,具体可以参考 官方文档, 相信只要使用过依赖注入框架的同学,都会对此有不同深入的理解,在此无需赘言. ...
- 单元测试中使用Moq对EF的DbSet进行mock
刚用上Moq,就用它解决了一个IUnitOfWork的mock问题,在这篇博文中记录一下. 开发场景 Application服务层BlogCategoryService的实现代码如下: public ...
- 使用Ninject+Moq在单元测试中抽象数据访问层
一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑 二.步骤如下 ...
- 使用 Moq 测试.NET Core 应用 - Why Moq?
什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...
- 使用 xUnit 编写 ASP.NET Core 单元测试
还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层做单元测试简直就是灾难啊..NET Core 吸取教训,在设计上考虑到了可测试性,就连 ASP ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- .Net Core单元测试规范
.Net Core单元测试规范 一. 前言 为了有效提升代码质量,保证DevOps的顺利进行.将全面开始采用单元测试进行覆盖,届时单元测试将完全纳入 到完整的持续构建生命周期中做为第一道质量把控的门槛 ...
- .NET Core 单元测试 MSTest
.NET Core 单元测试 MSTest ,MSTest Framework 已经支持 .NET Core RC2 / ASP.NET Core RC2. 之前都是使用 xUnit.net ,现在 ...
- 如何在 ASP.NET Core 测试中操纵时间?
有时候,我们会遇到一些跟系统当前时间相关的需求,例如: 只有开学季才允许录入学生信息 只有到了晚上或者周六才允许备份博客 注册满 3 天的用户才允许进行一些操作 某用户在 24 小时内被禁止发言 很显 ...
随机推荐
- 使用diff或者vimdiff比较远程文件(夹)与本地文件夹
方法1:管道给diff $ssh eric@192.168.1.11 "cat ~/remote_file.txt" | diff - ~/local_file.txt 如果 Fi ...
- shell-计算虚拟机创建时间
因为要验证虚拟机创建时间,所以写了下面一个脚本 #!/bin/bash ################################################################ ...
- TensorFlow 辨异 —— tf.placeholder 与 tf.Variable
https://blog.csdn.net/lanchunhui/article/details/61712830 https://www.cnblogs.com/silence-tommy/p/70 ...
- django 1.开发接口环境搭建
首先需要的环境: pycharm Python 3.6.0 django 2.1.3 安装命令: pip3 install django 查看版本号和安装的路径: pip show ...
- (BST 递归) leetcode98. Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- HTML界面多语言切换
我在做个人网站时考虑到多语言转换的问题,最后在JS文件中将所有文字数据储存然后设置HTML中的class与key属性来达到多语言效果.当然,还有一个别的方法,就是所有有文字内容的div都用不同语言写一 ...
- J.U.C-三剑客[semaphore\CyclicBarrier\CountDownLatch]
一.semaphore信号量,底层也是基于AQS 使用: /** * 可以理解为控制某个资源最多有多少个线程同时执行,(比如洗手间,并行与排队) * 如果满了只能等待直到其它资源释放(可以理解为并发量 ...
- idea编译错误提示编译版本不对,需要注意的配置
- SQLServer如果查询表相关的视图以及存储过程
最近在维护一个电商平台,需要对订单表增加字段,但是在review代码的时候发现这个平台的代码写的很有提升价值,且大量的使用了识图和存储过程,所以也给刚接触这个平台的萌新,也就是瓦,造成了不小的困扰,毕 ...
- 004 使用scrapy框架爬虫
0. 建立housePro的scrapy爬虫框架 # 1. 在终端输入,建立housePro项目scrapy startproject housePro# 2. 进入houseProcd houseP ...