title author date CreateTime categories
Moq基础 判断方法被执行
lindexi
2019-01-29 16:29:57 +0800
2019-01-17 14:27:29 +0800
mock 单元测试

如果想知道注入的类的某个方法被使用了几次,就可以通过 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 在里面会说到要求的是什么,但是实际调用的是什么

2019-1-29-Moq基础-判断方法被执行的更多相关文章

  1. Moq基础 判断方法被执行

    如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次 本文是一个系列,具体请看 Moq基础(一) 为什么需要单元测试框架 Moq基础(二) 快 ...

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

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

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

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

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

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

  5. [ 转载 ] Java基础13--equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...

  6. java基础—equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...

  7. [UWP开发]NavigationView基础使用方法

    原文:[UWP开发]NavigationView基础使用方法 [UWP开发]NavigationView基础使用方法 NavigationView是秋季创意者更新(16299)引入的新控件,用于生成W ...

  8. Alpha冲刺(6/10)——2019.4.29

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  9. String类的常用判断方法使用练习

    选取了一些常用的判断方法进行了使用练习,后续跟新其他方法 package StringDemo; // String类的判断方法解析 // 1:boolean equals(); // 判断字符串是否 ...

随机推荐

  1. beego应用做纯API后端如何使用jwt实现无状态权限验证

    jwt是什么,可以百度下其它文章,我原来看到一个讲的详细的,现在找不到了.先简单介绍下我个人的理解,就是一个token,只不过通过加密解密的手段,能让这一串字符带有一些简单的信息.这样解密jwt后不用 ...

  2. 核K-均值聚类(Kernel K-means Clustering)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wxcdzhangping/article/details/31366143 问题:        设 ...

  3. Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码

    前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...

  4. 2019.10.21 csp-s模拟测试81 反思总结

    T1: 把每一行状压,按行DP.设fi,j,k,i表示第几行,j是当前行的1覆盖状态,k是当前行选择按钮的状态.转移的时候枚举j和k,再枚举下一层的按钮选择情况l.如果l和j可以全覆盖当前层则转移合法 ...

  5. 百分比宽度并排元素浮动之后,设置margin,padding换行的问题

    今天遇到一个问题, 如下图,右边的div加了内边距换行: 解决方法: box-sizing: border-box;

  6. 解决git push、pull时总是需要你输入用户名和密码

    git config --global credential.helper store之后再次执行git push 或者git pull这时候还需要输入用户名和密码 下次就不需要了

  7. JavaScript文件与HTML文件本地连接

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. PHP的注释规范

    <?php //注释规范 /** *函数的功能 *@param 参数类型 参数名1 参数解析 *@param 参数类型 参数名2 参数解析 *@return 返回值类型 返回值解析 *@auth ...

  9. 在VMware安装Windows server 2003操作系统帮助文档

    在VMware上安装Windows server 2003操作系统,及VMware上三种网络连接模式(以VMware 10为例) 一.在Windows上安装VMware 10虚拟机软件 1.首先在Wi ...

  10. Python subn函数