使用 Moq 测试.NET Core 应用 -- Mock 属性
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html
第二篇文章, 关于方法Mock的介绍: https://www.cnblogs.com/cgzl/p/9300356.html
本文介绍Moq的使用.
使用的代码: https://github.com/solenovex/Moq4-Tutorial-Code 里面的 03 Before 部分.
Mock属性
属性是指 get set property.
接着上文, 我在03 Before部分的代码里做了一些修改.
首先IPhysicalExamination接口添加了IsMedicalRoomAvailable属性:

其实现类:

属性方法内依然没有做实现.
添加的这个属性在业务上的意思就是体检室是否可以使用. 如果不可以使用的话, 那么球员的转会操作应该被推迟.
所以还需要为转会结果枚举添加一个推迟:

最后在转会审批逻辑里进行判断, 如果体检室不可用, 那么转会就被推迟:

在单元测试里对属性进行mock非常的简单:

这个测试也会通过的:

递归Mock
修改一下IPhysicalExamination接口, 形成一个多层嵌套的属性:

IPhysicalExamination --> IMedicalRoom --> IMedicalRoomStatus --> IsAvailable.
通过上面这一串来判断体检室是否可用.
相应的实现类也要修改:

转会审批方法里也要修改:

而在单元测试的方法里, 肯定是报错的:

按照正常的思路, 我们可能会这样做:

就是从内到外一层一层的mock.
这么做是没问题的, 测试也会通过:

但是这样做很麻烦, 而Moq则提供了一种简单的方式来处理这种多层的/递归的mock:

这样写即可. 测试同样会通过:

为属性设置默认值
但是, 问题来了, 我还有一些其它的单元测试方法, 它们也需要用到这个属性, 现在它们的状态是:

有的测试失败是因为其MockBehavior是Strict的, 而其它的失败则是因为里面出现了NullReferenceException.
针对这些情况, 我们可以这样设定:

这样设置之后, 它会返回属性类型的默认值, 因为我没有设定返回值.
虽然测试依然不通过, 这是因为逻辑上的问题, 而不会抛出异常:

针对这种情况, 还有一种更好的办法. 我们可以为mock对象设定默认值:

把DefaultValue的值设为DefaultValue.Mock.
但是DefaultValue这个属性只对引用类型起作用(对值类型不起作用), 像这种递归的mock, 它会递归的创建所需的引用类型, 但是最后的IsAvailable这个值类型是不起作用的.
测试:

因为最后一层是bool类型的, 是值类型, 所以上面的设置不起作用, 返回的是false. 所以测试没通过.
那我就把它改成string类型好了:

审批方法:

然后再调试测试:

string是引用类型, 但是mock的值依然是null...??!!??
这是因为string是一个sealed class, 而DefaultValue.Mock只对接口, 抽象类和非sealed的class起作用....
不过测试仍然是可以通过的, 因为我改逻辑了:

注意, 这个默认值只对宽松(Loose) mock, 起作用.针对Strict mock, 仍然需要设定最后一层属性的值.
属性值变化跟踪
需要添加一些代码, 首先添加一个枚举:

为接口添加属性:

实现类:

然后在审批类里, 我设置了这个属性的值:

上面的代码也就是说, 我的mock对象的某个属性在测试的时候它的值会发生变化. 而Moq可以记住这些mock属性的变化的值.....
新写一个测试:

这里使用mockObj.SetupProperty()方法来开始追踪属性. 这个测试会通过:

该方法也可以通过下面的写法来为被追踪的属性设置默认值:
mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Failed);.
如果这个对象上有很多属性需要进行设置和追踪, 那么可以使用:
mock.SetupAllProperties(); 这个方法:

注意, 这个方法应该最先调用, 否则的话其它的设置可能会被覆盖.
本文完成的代码在: https://github.com/solenovex/Moq4-Tutorial-Code 里面的03 After.
未完待续......
使用 Moq 测试.NET Core 应用 -- 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的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- 使用 Moq 测试.NET Core 应用 - Why Moq?
什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...
- 使用 Moq 测试.NET Core 应用 -- 其它
第一篇文章, 关于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 ...
- Modernizr 测试浏览器是否兼容相应属性
Modernizr 测试浏览器是否兼容相应属性
- angularJS测试一 Karma Jasmine Mock
AngularJS测试 一 测试工具 1.NodeJS领域:Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm ...
随机推荐
- 把一个机器上1天内新增的文件用rsync传送到另外一台机器
我的shell很菜,只好用shell和php结合来做 1.查找新增的文件,构造rsync的参数,把结果写入到log中 find /data/bmob/test/teststorage/data/ -m ...
- Connection reset by peer的常见原因
1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒 ...
- Kafka的CommitFailedException异常
一.含义 CommitFailedException异常:位移提交失败时候抛出的异常.通常该异常被抛出时还会携带这样的一段话: Commit cannot be completed since the ...
- &,|,^的用法
&,|,~,^的用法 &按位与 |按位或 ~按位非 ^按位异或 举例: int x = 5; int y = 11; System.out.println(x|y); System.o ...
- rename.go
{ if err != nil { return err } return syscall.EINVAL } r ...
- 新版知乎登录之post请求
前言 在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱. 疑惑 在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/ ...
- 一步一步理解 python web 框架,才不会从入门到放弃 -- 开始使用 Django
背景知识 要使用 Django,首先必须先安装 Django. 下图是 Django 官网的版本支持,我们可以看到上面有一个 LTS 存在.什么是 LTS 呢?LTS ,long-term suppo ...
- BZOJ_2440_[中山市选2011]完全平方数_容斥原理+线性筛
BZOJ_2440_[中山市选2011]完全平方数_容斥原理 题意: 求第k个不是完全平方数倍数的数 分析: 二分答案,转化成1~x中不是完全平方数倍数的数的个数 答案=所有数-1个质数的平方的倍数+ ...
- 如何删除git远程仓库项目的所有内容,重新提交所有内容
如果我们上传了一个项目到git并已经commit和push了所有内容,但是忘记搞gitignore文件, 导致一些不想加入版本控制的文件,如IDE配置文件,编译文件,部署文件等, 现在不知道怎么办了? ...
- k8s经典实战—搭建WordPress
k8s经典实战—搭建WordPress说明:需要在k8s上部署lnmp环境,建议跟着步骤来端口最好不要改,希望你也能搭建成功,完成这个搭建后你对Kubernetes的技术基本上是入门了.首先看下效果图 ...