第一篇文章, 关于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 属性的更多相关文章

  1. 使用 Moq 测试.NET Core 应用 -- Mock 方法

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 本文介绍使用Moq来Mock方法. 使用的代码: https://git ...

  2. 使用 Moq 测试.NET Core 应用 -- Mock 行为

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...

  3. 使用 Moq 测试.NET Core 应用

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...

  4. 使用 Moq 测试.NET Core 应用 - Why Moq?

    什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...

  5. 使用 Moq 测试.NET Core 应用 -- 其它

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...

  6. Moq 测试 属性,常用方法

    RhinoMock入门(7)——Do,With和Record-playback 摘要: (一)Do(delegate)有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在 ...

  7. Moq 在.net Core 单元测试中的使用

    Moq,主要用来伪造接口的实现类,实现方法,属性 moq The most popular and friendly mocking framework for .NET What? Moq (pro ...

  8. Modernizr 测试浏览器是否兼容相应属性

    Modernizr  测试浏览器是否兼容相应属性

  9. angularJS测试一 Karma Jasmine Mock

    AngularJS测试 一 测试工具 1.NodeJS领域:Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm ...

随机推荐

  1. 新浪微博注册(elenium Python 自动化)

    from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom time import sleep ...

  2. MySQL 8 新特性之降序索引

    MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引 ...

  3. 【莫比乌斯反演】BZOJ2005 [NOI2010]能量采集

    Description 求sigma gcd(x,y)*2-1,1<=x<=n, 1<=y<=m.n, m<=1e5. Solution f(n)为gcd正好是n的(x, ...

  4. Error【0003】:配置桥接网络报错

    1.1 问题背景 在配置cosole宿主机的桥接网络环境时,在修改完/etc/sysconfig/ifcg-ethx和/etc/sysconfig/ifcg-brx后,执行service networ ...

  5. Python3字符串替换replace(),translate(),re.sub()

    Python3的字符串替换,这里总结了三个函数,replace()和translate()和re.sub() replace() replace() 方法把字符串中的 old(旧字符串) 替换成 ne ...

  6. Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  7. asp.net core系列 55 IS4结合Identity密码保护API

    一.概述 OAuth 2.资源所有者密码授权允许客户端(Client项目)向令牌服务(IdentityServer项目)发送用户名和密码,并获取代表该用户的访问令牌.本篇将IS4结合asp.net c ...

  8. Android快速开发常用知识点系列目录

    项目构建 Android项目目录结构模板以及简单说明[简单版] Android Studio配置统一管理依赖版本号引用 Android多Module下的Application引用方式 APP开篇 An ...

  9. 10 年三线小城 IT 开发的感悟

    一贯都是写技术博客,从来没写过感悟类文章,因为文笔不好.今天看到了大飞的一篇文章,<技术人,请不要封闭自己>,真的感触太深了. 一 先说说我自己,我并非科班出身,大学毕业后一直没找到好的工 ...

  10. 关于vue使用form上传文件

    在vue中使用form表单上传文件文件的时候出现了一些问题,获取文件的时候一直返回null, 解决之后又出现发送到后台的file文件后台显示为空,解决源码 <template> <d ...