第一篇文章, 关于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 应用 -- 其它的更多相关文章

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

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

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

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

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

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

  4. 使用 Moq 测试.NET Core 应用 -- Mock 属性

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

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

    第一篇文章, 关于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. solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)

    一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...

  9. 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

    事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...

随机推荐

  1. bmob云代码中生成缩略图

    function onRequest(request, response, modules) { var options = { url:"https://api.bmob.cn/1/ima ...

  2. Django—models相关操作

    一.在django后台admin管理页面添加自己增加的表结构 通过终端命令:python3 manage.py makemigrations, python3 manage.py migrate 我们 ...

  3. file.go

        //    return int64(f.offset), errors.New("offset > file.size")     //}else {     // ...

  4. BZOJ_3282_Tree_LCT

    BZOJ_3282_Tree_LCT Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询 ...

  5. 单机配置kafka和zookeeper

    1:环境准备 jdk 推荐oracle,不建议open sdk 在/etc/profile加入下列环境变量 在PATH中将jdk和jre的bin加入path里面 $JAVA_HOME/bin:$JRE ...

  6. 贝叶斯深度学习(bayesian deep learning)

      本文简单介绍什么是贝叶斯深度学习(bayesian deep learning),贝叶斯深度学习如何用来预测,贝叶斯深度学习和深度学习有什么区别.对于贝叶斯深度学习如何训练,本文只能大致给个介绍. ...

  7. 用原生JS从零到一实现Redux架构

    前言 最近利用业余时间阅读了胡子大哈写的<React小书>,从基本的原理讲解了React,Redux等等受益颇丰.眼过千遍不如手写一遍,跟着作者的思路以及参考代码可以实现基本的Demo,下 ...

  8. 聚焦“云开发圆桌论坛”,大前端Serverless大佬们释放了这些讯号!

    4月14日,由云加社区举办的TVP&腾讯云技术交流日云开发专场,暨"腾讯云-云开发圆桌论坛"在北京.深圳两地同步举行. 当天下午,一场主题为"基于大前端和node ...

  9. SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念

    这节比较枯燥,都是原理,不过也有干货.这篇能不能听懂,就决定是否入门...所以,加油吧 博客园/B站/知乎/CSDN  @秋意正寒 转载请在文头注明本文地址 本篇讲空间句法的几个核心概念,有一些也是重 ...

  10. OpenResty 在又拍云容器平台中的应用

    大家好,我是又拍云叶靖,今天主要分享 OpenResty 在又拍云容器平台中的应用.目前又拍云有很多产品,其中很多都使用了 OpenResty 技术,比如又拍云的 CDN .网关都是基于 OpenRe ...