第一篇文章, 关于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. 把一个机器上1天内新增的文件用rsync传送到另外一台机器

    我的shell很菜,只好用shell和php结合来做 1.查找新增的文件,构造rsync的参数,把结果写入到log中 find /data/bmob/test/teststorage/data/ -m ...

  2. Connection reset by peer的常见原因

    1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒 ...

  3. Kafka的CommitFailedException异常

    一.含义 CommitFailedException异常:位移提交失败时候抛出的异常.通常该异常被抛出时还会携带这样的一段话: Commit cannot be completed since the ...

  4. &,|,^的用法

    &,|,~,^的用法 &按位与 |按位或 ~按位非 ^按位异或 举例: int x = 5; int y = 11; System.out.println(x|y); System.o ...

  5. rename.go

    {         if err != nil {             return err         }         return syscall.EINVAL     }     r ...

  6. 新版知乎登录之post请求

    前言 在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱. 疑惑 在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/ ...

  7. 一步一步理解 python web 框架,才不会从入门到放弃 -- 开始使用 Django

    背景知识 要使用 Django,首先必须先安装 Django. 下图是 Django 官网的版本支持,我们可以看到上面有一个 LTS 存在.什么是 LTS 呢?LTS ,long-term suppo ...

  8. BZOJ_2440_[中山市选2011]完全平方数_容斥原理+线性筛

    BZOJ_2440_[中山市选2011]完全平方数_容斥原理 题意: 求第k个不是完全平方数倍数的数 分析: 二分答案,转化成1~x中不是完全平方数倍数的数的个数 答案=所有数-1个质数的平方的倍数+ ...

  9. 如何删除git远程仓库项目的所有内容,重新提交所有内容

    如果我们上传了一个项目到git并已经commit和push了所有内容,但是忘记搞gitignore文件, 导致一些不想加入版本控制的文件,如IDE配置文件,编译文件,部署文件等, 现在不知道怎么办了? ...

  10. k8s经典实战—搭建WordPress

    k8s经典实战—搭建WordPress说明:需要在k8s上部署lnmp环境,建议跟着步骤来端口最好不要改,希望你也能搭建成功,完成这个搭建后你对Kubernetes的技术基本上是入门了.首先看下效果图 ...