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

第一篇文章, 关于Mock的概念介绍:https://cloud.tencent.com/developer/article/1172536

第二篇文章, 关于方法Mock的介绍: https://cloud.tencent.com/developer/article/1172539

第三篇文章, 关于属性Mock的介绍: https://cloud.tencent.com/developer/article/1172543

本文介绍使用Moq进行行为测试.

使用的代码: https://github.com/solenovex/Moq4-Tutorial-Code 里面的 04 Before 部分.

Mock 行为

前两篇介绍的内容都是基于状态的测试, 也就是代码执行后, 我们坚持被测试系统的状态是否和我们期待的一致.

而本文介绍的是行为测试, 也就是说我们要确认某些方法会被执行或者某些属性被访问了.

确认方法被调用

创建一个新的测试方法:

与状态测试不同, 这里我不使用Assert, 我是用的是mock.Verify() 来判定其参数里的方法会被执行. 在这里也可以使用It类进行参数匹配.

该测试会通过, 表示IsHealthy确实被执行了:

如果我改变一下Verify里IsHealthy()方法的参数范围:

那么针对此例, 测试就会失败:

这是因为IsHealthy()方法被调用时的参数与我所期待的参数不一致.

自定义错误信息

这时, 我们可以使用另一个重载版本的Verify()方法, 它可以添加一个错误信息的参数:

这时测试失败的信息如下:

此外通过重载方法, 还可以判断方法被调用的次数

方法被调用次数

还是用到了Verify的重载方法和Times这个struct.

1. 没被调用:

2. 被调用1次:

3. 被调用特定次数:

Times这个struct里面还有很多选项, 请自行摸索.

确认属性访问

首先是Get.

与之前调用的Verify()不同, 针对属性, 需要使用VerifyGet()方法来确保属性被访问了:

这个测试会通过, 因为这个属性确实被访问了:

检查另一个没有被访问的属性:

那么结果就会失败:

下面是Set.

很简单, 使用VerifySet()方法即可. 再创建一个测试方法:

在VerifySet方法里需要设定被Set的属性以及被Set的值.

针对此例, 这个测试会通过:

但是如果Set的值不正确, 测试就会失败:

本文先到这....未完待续....

代码: https://github.com/solenovex/Moq4-Tutorial-Code 04 After.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

Roslyn 通过 Target 修改编译的文件

本文也是带着一个任务来开始。任务就是本渣是一个腹黑的开发者,想要在开发的过程替换一个文件,让开发者在编译出来的文件和他调用的文件是两个不同的文件。

1342
来自专栏流媒体

dll生成和使用

1052
来自专栏大内老A

学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup

一个ASP.NET Core应用被启动之后就具有了针对请求的处理能力,而这个能力是由管道赋予的,所以应用的启动同时意味着管道的成功构建。由于管道是由注册的服务器...

4004
来自专栏赵俊的Java专栏

使用 Python 操作 HDFS

3152
来自专栏difcareer的技术笔记

Dalvik虚拟机原理及Xposed hook原理

这块知识本身是挺多的,网上有对应的源码分析,本文尽量从不分析代码的角度来把原理阐述清楚。

2051
来自专栏bboysoul

linux下如何编译带有math.h头文件的程序

环境是centos7 大概意思是没有定义sqrt函数 百度要自己去指定头文件去编译命令如下: gcc [文件名] -lm 参数解释 -l 指定程序链接...

923
来自专栏QQ音乐技术团队的专栏

Unity Android Plugin开发指南

本文将介绍如何在Unity工程中使用Android或者Java的库,包括: 如何在Unity项目中使用Android Plugin Unity-Android相...

1.4K7
来自专栏LhWorld哥陪你聊算法

C语言的学习

 r  只读  rb只读  r+ rb+(不带b的为已存在的文本文件,带b的为二进制文件(binary),带+号的为读写文件)

1772
来自专栏九彩拼盘的叨叨叨

Node.js 版本管理器: nvm 介绍

有时候,我们需要测试写的 Nodejs 的程序在不同 Nodejs 版本下是否能正常运行;或是我们想要尝试下最新版 Nodejs 的新特性,但常用的代码需要旧版...

871
来自专栏梦魇小栈

笔记:NPM版本号自增,自动化发布NPM包

Description 在一个包的目录下执行此命令,会提升版本号,并把这个新的版本号写进package.json文件,如果存在npm-shrinkwrap.js...

2522

扫码关注云+社区

领取腾讯云代金券