使用 Moq 测试.NET Core 应用 -- 其它
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html
第二篇文章, 关于方法Mock的介绍: https://www.cnblogs.com/cgzl/p/9300356.html
第三篇文章, 关于属性Mock的介绍: https://www.cnblogs.com/cgzl/p/9304567.html
第四篇文章, 关于行为Mock的介绍: https://www.cnblogs.com/cgzl/p/9306728.html
本文介绍使用Moq其它一些功能.
使用的代码: https://github.com/solenovex/Moq4-Tutorial-Code 里面的 05 Before 部分.
抛出异常
这里是指让mock对象抛出异常.
首先创建一个测试方法, 并设定球员年龄小于16岁时, IPhysicalExamination会在调用IsHealthy()方法时抛出异常:

随后在球员审批的方法里, 需要捕获这个异常, 并返回相应的结果:

这个测试会通过:

上面使用的是泛型的版本来抛出异常, 也可以不使用泛型, 直接抛出异常:

Events
我们还可以让mock对象来引起事件.
首先在IPhysicalExamination添加一个event:

每当IsHealthy()方法被调用后, 就应该引起这个event事件.
在实现类里, 也需要加上这个event, 但是暂时不对它做任何其它动作:

在转会审批类里, 做这样几处修改:

添加一个处理事件的方法, 如果事件被触发, 那么PlayerHealthChecked这个标识就会变成true.
创建一个测试方法, 以判断该event是否被触发:

这个测试应该会失败:

因为该event并没有被触发(PhysicalExamination里并没做什么动作).
这时, 我们可以使用mock对象来触发该事件, 在测试方法里, 手动调用mock对象的Raise()方法:

第一个参数是lambda表达式, 该事件绑定到null, 第二个参数针对本例是EventArgs.Empty即可.
再测试, 就会通过:

第二种方法是在设置IsHealthy()方法的时候对事件进行触发设定:

这样的话只要IsHealthy()方法被调用, 那么HealthChecked这个事件也会被触发.
该测试也会通过:

设定连续调用的不同返回值
使用SetupSequence()方法可以为mock对象的成员在连续调用的时候每次都返回指定的值(或抛出指定的异常):

该测试执行时, 第一次调用IsHealthy()方法时, 该方法返回true, 体检通过; 而第二次调用IsHealthy()方法时, 返回false, 体检不通过.
这个测试是会通过的:

Mock 不实现接口的方法
首先建立一个类, 它没有实现任何接口, 里面有一个方法用于判断当前是否处于转会期:

然后在转会审批类里使用该类:

创建一个测试方法, mock上面的类:

但是该测试回失败:

这是因为Moq在mock这种类的时候要求其方法必须是virtual的.
那么修改该方法为virtual:

这样的话测试就会通过:

Protected Virtual 方法
为上面的类再添加一个protected virtual 方法:

如果想要mock这个方法的话, 需要这样用:

有参数的话, 需要用到ItExpr类.
Linq to Mocks
我们可以把之前写的设定代码使用Linq的方式来写:

这里要使用Mock.Of<T>()方法. 参数的lambda表达式里面可以设定mock对象成员的返回值.
由于这种方法直接返回所需的类型, 所以在使用mock对象的时候就无需使用.Object属性了.
该测试也会通过:

Moq的简介就到这里, 其实看官方文档会更快速一些: https://github.com/Moq/moq4/wiki/Quickstart
重构后的代码在: https://github.com/solenovex/Moq4-Tutorial-Code 里面的05 After.
使用 Moq 测试.NET Core 应用 -- 其它的更多相关文章
- 使用 Moq 测试.NET Core 应用
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- 使用 Moq 测试.NET Core 应用 - Why Moq?
什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...
- 使用 Moq 测试.NET Core 应用 -- Mock 方法
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 本文介绍使用Moq来Mock方法. 使用的代码: https://git ...
- 使用 Moq 测试.NET Core 应用 -- Mock 属性
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- 使用 Moq 测试.NET Core 应用 -- Mock 行为
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- Moq 测试 属性,常用方法
RhinoMock入门(7)——Do,With和Record-playback 摘要: (一)Do(delegate)有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在 ...
- Moq 在.net Core 单元测试中的使用
Moq,主要用来伪造接口的实现类,实现方法,属性 moq The most popular and friendly mocking framework for .NET What? Moq (pro ...
- solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)
一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...
- 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能
事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...
随机推荐
- javascript系列1--把字符串当代码来执行
转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html 请尊重笔者的劳动成果 --John Hou 在javascript中有多种方法可以 ...
- Micropython TPYBoard ADC的使用方法
基本用法 import pybadc = pyb.ADC(Pin('Y11')) # create an analog object from a pinadc = pyb.ADC(pyb.Pin.b ...
- 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析
这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...
- 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。
我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...
- JavaScript使用闭包实现单例模式
闭包是JS的一种特性,其中一点就是:可以将外部函数的变量保存在内存中,利用这一特性,我们可以用来实现类的单例模式. 首先需要了解何为单例模式: 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问 ...
- 小程序 textarea、input 层级过高,导致填写内容穿透,z-index无效问题解决方案。
小程序的textare.input输入框层级是最高的 那么我们在textare.input输入的内容就会总是显示在最上一层. 这是时为什么呢?官方文档有说明,因为textare.input这些是原生组 ...
- 别开心太早,Python 官方文档的翻译差远了
近几天,很多公众号发布了 Python 官方文档的消息.然而,一个特别奇怪的现象就发生了,让人啼笑皆非. Python 文档的中文翻译工作一直是“默默无闻”,几个月前,我还吐槽过这件事<再聊聊P ...
- 无敌简单快速的文件服务器sgfs
前言 想要构建一个Linux文件服务器?看看下面几个要求是不是你想要的? 1.只需要单节点部署就够了 2.部署启动简单,下载之后,一键启动,一键关闭 3.不需要任何其他的依赖安装,而且运行时占用内存资 ...
- Element-ui使用技巧
使用第三方字体包 把下载后的*.zip字体包放到项目中在main.js中引用. import "@/assets/font/iconfont.css"; 注意一定要放到elemen ...
- 解决Google Play审核中的WebViewClient.onReceivedSslError问题
Google Play应用市场提交应用审核,出现因WebViewClient.onReceivedSslError问题导致拒绝通过. Google Paly给出的详情地址:support.google ...