使用 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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jeremy的技术点滴

powershell学习备忘

5956
来自专栏blackheart的专栏

MSBuild入门(续)

MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见...

2139
来自专栏西枫里博客

解决ThinkPHP升级5.1后输出字符被转义的问题。

最近给博客升级框架,由于从5.0过渡到5.1要修改的地方还蛮多的,加上之前一些代码在实际运行中略显低效,索性就把后端重构一下。把一些关键部位调整到位后刷新页面,...

2256
来自专栏GreenLeaves

七、Framework类库

1、Framework类库简介   .Net Framework类库包含Framework类库(Framework Class Library,FCL).FCL...

3197
来自专栏大内老A

为什么GAC和VS引用的程序集不一致?

我们知道VS开发中引用的程序集和运行时的程序集来源于不同的地方,前者来源于%ProgramFiles%\Reference Assemblies\Microso...

2027
来自专栏陈树义

简单笔记

1、类的表面类型和实际类型 实例对象有两个类型:表面类型(Apparent Type)和实际类型(ActualType),表面类型是声明时的类型,实际类型是对象...

2615
来自专栏nimomeng的自我进阶

Swift4 新特性一览

当然,由于Session的时间限制,肯定没有把所有Swift4的特性说全。仅就列出来的这几个,我个人比较喜欢的有 XCode支持Swift的refactor,S...

1892
来自专栏枕边书

搭建自己的PHP框架心得(二)

续言 对于本次更新,我想说: 本框架由本人挑时间完善,而我还不是PHP大神级的人物,所以框架漏洞难免,求大神们指出。 本框架的知识点应用都会写在博客里,大家有什...

2538
来自专栏梦里茶室

一个由proguard与fastJson引起的血案

更新微信sdk导致ComposeData中的内部类ComposeDataSender方法被混淆 根本原因,fastjson使用姿势不对。 问题描述: 一个发件人...

2167
来自专栏MasiMaro 的技术博文

PE文件详解(七)

本文转载自小甲鱼PE文件讲解系列原文传送门 这次主要说明导出表,导出表一般记录着文件中函数的地址等相关信息,供其他程序调用,常见的.exe文件中一般不存在导...

1661

扫码关注云+社区

领取腾讯云代金券