如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次

本文是一个系列,具体请看

  • Moq基础(一) 为什么需要单元测试框架

  • Moq基础(二) 快速使用 Mock 写代码,区分stub和mock是什么

  • Moq基础(三) 伪造特定方法

  • Moq基础(四) 伪造属性和事件

  • Moq基础(五) 参数匹配,回调,和验证

  • Moq基础(六) 对Moq使用的评价

本文是在Moq基础(五)的基础上做的补充

例如有方法 Foo 支持注入接口 IFoo 需要判断在 Foo 方法里面调用 IFoo 的 Foo 方法几次

   public class Foo{/// <inheritdoc />public Foo(IFoo foo){_foo = foo;}public void A(){_foo.Foo();}private readonly IFoo _foo;}public interface IFoo{void Foo();}

此时就可以通过先做一个虚拟的方法

var mock = new Mock<IFoo>();var foo = new Foo(mock.Object);// 创建一个虚拟方法mock.Setup(fake => fake.Foo());

然后调用 foo 的需要被测试方法

                    foo.A();

接着判断这个 IFoo 的 Foo 被调用多少次

                    // 判断在调用 A 之后调用了 IFoo 的 Foo 方法多少次mock.Verify(fake => fake.Foo(), Times.Once);

这是整个测试方法的代码

    [TestClass]public class FT{[ContractTestCase]public void A(){"调用 Foo 的 A 方法时会调用 IFoo 的 Foo 方法一次".Test(() =>{// Arrangevar mock = new Mock<IFoo>();var foo = new Foo(mock.Object);// 创建一个虚拟方法mock.Setup(fake => fake.Foo());// Actionfoo.A();foo.A();// Assert// 判断在调用 A 之后调用了 IFoo 的 Foo 方法多少次mock.Verify(fake => fake.Foo(), Times.Once);});}}

如果觉得上面的代码写的不错,可以清晰看到每个测试方法,而不是去写小伙伴都看不懂的英文,那么请让使用 MSTestEnhancer 这个测试框架的使用方法十分简单,具体请看MSTestEnhancer 的使用

使用了之后就可以在运行单元测试的时候看到有哪些方法可以运行,有哪些不通过

下面将会详细告诉大家如何使用方法验证

在 Mock 可以通过 Setup 做出虚拟的方法,为什么需要在 Setup 方法里面再次调用需要被虚拟的方法?因为在 Setup 里面调用的时候,实际是说构造出哪些方法是虚拟的方法

对于不需要被调用的方法就不会在 Setup 构造,这样如果发现被测试的类调用了没有被虚拟的方法,那么证明这个被测试的类有坑

另外在做出虚拟的方法的时候,还可以要求传入参数,在传入参数的时候实际就是对传入的参数做出验证。这里请看Moq基础(五) 参数匹配,回调,和验证 里面有详细说到。

那么在实际运行被测试类的方法之后,就可以通过 Verify 判断某个方法被调用了多少次

mock.Verify(fake => fake.虚拟的方法, 被调用多少次);

这里的被调用多少次是可以是 Times 属性,这个属性有下面的取值

  • Once 方法只是被调用一次

  • AtLeast 至少多少次,这个方法可以传入参数

  • AtLeastOnce 至少一次

  • AtMost 最多多少次,这个方法可以传入参数

  • AtMostOnce 最多一次

  • Between 在 xx 到 xx 中间,这个方法可以传入参数

  • Exactly 刚好被调用多少次,这个方法可以传入参数

  • Never 没有被使用

通过这个方法就可以判断一个方法被多少次调用,需要注意,在 Verify 里面需要调用被虚拟的方法是用来做参数判断的,可以判断传入了某个参数的方法调使用多少次的方法

如果不满足就会在 Verify 方法抛出 MockException 在里面会说到要求的是什么,但是实际调用的是什么

我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

Moq基础 判断方法被执行相关推荐

  1. aop判断方法是否执行成功_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  2. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  3. Java基础学习——方法

    Java基础学习--方法 前言 本文将介绍有关Java面向对象编程的知识之一:方法:其中包括方法的概念,三类方法的格式.方法的重载以及方法的内存 方法的概念 方法是程序中最小的执行单元 方法定义:将一 ...

  4. 数据类型Map判空 、空字符串、空key值等各种判断方法,全网最详细

    Map集合对于开发人员来说,除了JSON以外,这种key,value存储的方式最熟悉不过了,做项目的过程中,会高频用到Map的数据结构.在业务逻辑层处理中,往往会对Map数据类型进行一些判空的处理,自 ...

  5. 【spring源码系列-05】refresh中prepareRefresh方法的执行流程

    Spring源码系列整体栏目 内容 链接地址 [一]spring源码整体概述 https://blog.csdn.net/zhenghuishengq/article/details/13094088 ...

  6. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

  7. js 判断变量是否有值返回bool_基础 |判断 JS 中的变量类型竟然可以如此简单

    原标题:基础 |判断 JS 中的变量类型竟然可以如此简单 嗨 这里是IMWEB 一个想为更多的前端人 享知识 助发展 觅福利 有情怀有情调的公众号 欢迎关注转发 让更多的前端技友一起学习发展~ 正文 ...

  8. SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流...

    SaltStack介绍和架构解析 简介 SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltSta ...

  9. python判断sqlite连接状态_python3 自动识别usb连接状态,即对usb重连的判断方法

    在做自动化测试时,遇到两种情况需要判断usb是否已连接上(注,本文仅针对用adb命令来control手机) 一种是在开测时(前提是同时要测试多台), 希望等待所有设备usb全部识别后同时进行测试.对于 ...

最新文章

  1. ECSHOP学习笔记
  2. 独家 | 由第一原理导出卷积
  3. mysql自动分区partition_Mysql分区表及自动创建分区Partition
  4. wxWidgets:编写一个应用程序- 使用 WxTextCtrl
  5. css中图片有缩放和转动效果
  6. 索引(转载自百度百科)
  7. 【java】 从hotspot底层对象结构理解锁膨胀升级过程
  8. 可视化编程真的有那么糟糕?
  9. 我为什么要帮你查 Bug?
  10. C#读取所有PC中所有进程
  11. php中的try语句,PHP Try-catch 语句使用技巧
  12. windows7:“创建系统修复光盘”
  13. React Hooks 实战 CNode 社区移动端网站
  14. NVIDIA助力风暴英雄黄金世俱杯Ballistix强势夺冠
  15. 圆方树总结 [uoj30]Tourists
  16. 【聚宽本地数据JQData】一个简单的股票回测策略
  17. 最佳情侣身高差c语言函数,“最佳情侣身高差是多少为妙?”哈哈哈,神评尤为突出啊...
  18. python中花括号_震惊Python的精髓居然是方括号花括号和圆括号
  19. 高红梅:第四章 第三节 现代工业文明的反思与高贵野蛮人的身份认同
  20. 大华测试笔试题_浙江大华笔试题

热门文章

  1. 如何在阿里云申请和注册域名(域名绑定解析)?
  2. jenkins节点配置
  3. Android 桌面小组件
  4. PHP代码的一些兼容写法
  5. WZSZF 整站源码,原来就是DISCUZ。
  6. vue3一键回到顶部方法
  7. 行为识别 Activity Recognition
  8. 广州机场停车场收费标准2022,广州白云机场停车5天多少钱
  9. Android获取手机相册图片
  10. 手机相册里android照片的来源,为什么手机相册总是出现不知道哪里来的照片?|实用...