2019-1-29-Moq基础-判断方法被执行
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基础-判断方法被执行的更多相关文章
- Moq基础 判断方法被执行
如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次 本文是一个系列,具体请看 Moq基础(一) 为什么需要单元测试框架 Moq基础(二) 快 ...
- Moq中判断方法是否被执行时,参数中有列表的情况
如果参数中有列表,列表项为引用类型时,则会判断列表项是否为同一引用 列表本身不判断
- 前端基础——js数据类型及判断方法
一.数据类型 我们通常熟知的数据类型有六种,包括5种基本数据类型(Number, String, Boolean, Undefined, Null)和一种引用数据类型(Object).ES6又新增了一 ...
- C#基础之方法和参数
C#基础之方法和参数 接上一篇<C#基础之类型和成员基础以及常量.字段.属性> 实例方法.静态方法 C#中的方法分为两类,一种是属于对象(类型的实例)的,称之为实例方法,另一种是属于类型的 ...
- [ 转载 ] Java基础13--equals方法
一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...
- java基础—equals方法
一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...
- [UWP开发]NavigationView基础使用方法
原文:[UWP开发]NavigationView基础使用方法 [UWP开发]NavigationView基础使用方法 NavigationView是秋季创意者更新(16299)引入的新控件,用于生成W ...
- Alpha冲刺(6/10)——2019.4.29
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- String类的常用判断方法使用练习
选取了一些常用的判断方法进行了使用练习,后续跟新其他方法 package StringDemo; // String类的判断方法解析 // 1:boolean equals(); // 判断字符串是否 ...
随机推荐
- ORACLE时间常用函数(字段取年、月、日、季度)
TO_DATE格式 Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal tw ...
- 给没有id主键的表添加id,并设置为not null 然后填充自增id
买的ip数据库,表上不带id 使用hibernate比较麻烦,所以直接改表 增加一个字段id,类型int ALTER TABLE t_ip ADD id int; 设置id不为空设置为主键,自增 AL ...
- python实例 输出字符串和数字
但有趣的是,在javascript里我们会理想当然的将字符串和数字连接,因为是动态语言嘛.但在Python里有点诡异,如下: #! /usr/bin/python a=2 b="test&q ...
- LAMP标准化安装
操作系统说明: 操作系统 版本 linux red hat release 6.4 关键软件包说明: 软件包 版本 目录 运行用户 httpd-2.2.27.tar.gz 2.2.27 /usr/lo ...
- PHP通过sql生成CSV文件并下载,PHP实现文件下载
/** * PHP通过sql生成CSV文件并下载 * @param string $sql 查询sql,结果为二维数组 * @param array $title 数据,CSV文件标题 * @para ...
- CSS制作的32种图形效果[梯形|三角|椭圆|平行四边形|菱形|四分之一圆|旗帜]
转载链接:http://www.w3cplus.com/css/css-simple-shapes-cheat-sheet 前面在<纯CSS制作的图形效果>一文中介绍了十六种CSS画各种不 ...
- Liferay 7:如何在Liferay Portlet中使用Angular, React, Vue.js等前端框架
https://web.liferay.com/zh/web/ivan.zaera/blog/-/blogs/modern-frontend-workflows-in-liferay-portal L ...
- 【linux配置】虚拟机配置静态IP地址
使用VMware配置虚拟机静态IP地址 一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子 ...
- myeclipse设置自动热部署
MyEclipse中开发网站项目如何设置关联的Tomcat服务器热启动,即修改项目源代码时不需要每次都重启Tomcat 目前在做一个网站项目,使用MyEclipse+Tomcat,每次修改项目源代码时 ...
- Vue项目中出现Loading chunk {n} failed问题的解决方法
最近有个Vue项目中会偶尔出现Loading chunk {n} failed的报错,报错来自于webpack进行code spilt之后某些bundle文件lazy loading失败.但是这个问题 ...