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


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

本文是在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(() =>
{
// Arrange var mock = new Mock<IFoo>();
var foo = new Foo(mock.Object);
// 创建一个虚拟方法
mock.Setup(fake => fake.Foo()); // Action foo.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. 2019-1-29-Moq基础-判断方法被执行

    title author date CreateTime categories Moq基础 判断方法被执行 lindexi 2019-01-29 16:29:57 +0800 2019-01-17 1 ...

  2. Moq中判断方法是否被执行时,参数中有列表的情况

    如果参数中有列表,列表项为引用类型时,则会判断列表项是否为同一引用 列表本身不判断

  3. Quartz.Net的基础使用方法,多任务执行继续扩展

    前一篇随笔讲了Quartz多任务的简单实现 Quartz.Net的基础使用方法,多任务执行 这一篇,来简单对前一篇进行一下简单的扩展 看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里 ...

  4. 前端基础——js数据类型及判断方法

    一.数据类型 我们通常熟知的数据类型有六种,包括5种基本数据类型(Number, String, Boolean, Undefined, Null)和一种引用数据类型(Object).ES6又新增了一 ...

  5. 逆向与BOF基础——注入shellcode并执行&Return-to-libc

    逆向与BOF基础--注入shellcode并执行 准备阶段 下载安装execstack. 本次实验实验的shellcode是心远的文章中生成的代码,即\x31\xc0\x50\x68\x2f\x2f\ ...

  6. 《Java基础复习》-控制执行流程

    最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...

  7. initMethod 和 afterPropertiesSet 以及 AwareMethod方法的执行时机

    在spring开发中,我们定义bean 经常会需要用到beanFactory对象,这就需要实现BeanFactoryAware这种类型的接口,它有一个setBeanFactory方法   在xml中配 ...

  8. C#基础之方法和参数

    C#基础之方法和参数 接上一篇<C#基础之类型和成员基础以及常量.字段.属性> 实例方法.静态方法 C#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...

  9. Asp.net mvc 中Action 方法的执行(一)

    [toc] 在 Aps.net mvc 应用中对请求的处理最终都是转换为对某个 Controller 中的某个 Action 方法的调用,因此,要对一个请求进行处理,第一步,需要根据请求解析出对应的 ...

随机推荐

  1. phpcms 按价格、按销量、按时间等排序实现思路

    大体思路是在链接中加入指定排序的参数,例如我们使用get中的order作为排序参数: order=views 人气:order=sells 效率:order=pirce 按价格: 那么这三个排序按钮的 ...

  2. JavaScript--预解析在IE存在的问题

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 如何用KNIME进行情感分析

    Customer Intelligence Social Media Finance Credit Scoring Manufacturing Pharma / Health Care Retail ...

  4. 对快速排序的分析 Quick Sort

    快速排序 快排的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序.通常可选第一个记录为基准 ...

  5. hdu3917 最大权闭合图

    题意:有N个城市,M个公司.现在需要建立交通是获得的利益最大.如果2个公司A,B, A修的路为Xa->Ya,B的路为Xb->Yb,如果Ya==Xb,那么这2个公司有关系. 对于每个公司都有 ...

  6. laravel 操作日志;

    在网上寻找了许多方法,觉得有的地方看不懂,  决定自己写一些关于laravel中调用本身中的操作日志: Laravel 日志工具在强大的 Monolog 函数库上提供一层简单的功能.Laravel 默 ...

  7. MySQL运算符和函数

    运算符 1.算数运算符 加(+):mysql> SELECT 1+1; 减(-):mysql> SELECT 3-2; 乘(*):mysql> SELECT 2*3; 除(/):my ...

  8. [***]沙雕低错集(算起来因为低错挂掉的分快够我AK三场了……)

    由于沙雕错太多了所以不想写了,看着就难受…… 各种沙雕错(自从上次考试开始各种犯沙雕低错……): !!!sort是不稳定的排序,如果排序结构题只按其中一个关键字排序,那么在关键字相等时,排序多次的结果 ...

  9. VelocityTracker监控速度!!!

    用来追踪触摸事件(flinging事件和其他手势事件)的速率.用obtain()函数来获得类的实例,用addMovement(MotionEvent)函数将motion event加入到Velocit ...

  10. Java练习 SDUT-1255_小明A+B

    小明A+B Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, ...