.net测试篇之Moq行为配置
我们前面说过.Moq在创建模拟对象的时候,简单对象赋值默认值,引用对象赋值为null,但是有些时候接口里面还包含另一个接口对象,我们知道Moq是可以模拟一个接口对象的,我们可以通过配置让Moq模拟所有可以Mock的对象.
我们新增如下代码
public interface IDtoWrapper
{
MyDto Dto { get; set; }
string GetString();
}
public interface IOutString
{
IDtoWrapper wrapper { get; set; }
}
比如我们要模拟一个IOutString对象,如果不使用默认的行为则里面的wrapper对象返回为Null,如果这样我们没法再继续操作了.
我们可以对Moq的Default行为进行配置,让它对IDtoWrapper对象也进行Mock
测试代码如下
[Test]
public void BehaviorConfig()
{
var moq = new Mock<IOutString>();
moq.DefaultValue = DefaultValue.Mock;
Assert.NotNull(moq.Object.wrapper);
}
以上测试会通过.这时候wrapper不再是null,我们便可以对其进行操作了.
我们通过调试可以发现这时候不但IDtoWrapper不再是null,它里面的Dto属性也被赋值为一个new MyDto.是不是Mock框架可以模拟一个对象呢,实际上确实是可以,只不过是它模拟对象有很多限制,比如不能模拟不包含无参构造函数的对象,不能模拟不带virtual或者abstract的方法等.如果我们对模拟的对象的方法没有virual或者abstract修饰,这时候如果进行setup则会抛出异常.
前面我们讲的如何通过配置使mock自动mock遇到到层级可Mock对象.这一节我们来看另一个问题.
假如有这样一种场:要mock的接口里有一个Name属性,在业务层我们要根据这个Name决定进入switch的不同分支里面,但是回顾前面的章节,我们没有遇到这种情况,我们都是只是在mock对象建立时使用setup为要mock的对象的字段设置值.很多人可能会想,可以通过moq对象实体的Object属性把这个对象拿出来,然后改变它的值.我们来看看这样做可行不可行.
我们有以下一个简单接口
public interface ISt
{
string Name { get; set; }
int Age { get; set; }
}
测试方法如下
[Test]
public void BehaviorConfig()
{
var moq = new Mock<ISt>();
var obj = moq.Object;
obj.Name = "baidu";
Assert.NotNull(moq.Object.Name);
}
我们把moq的Object对象赋值给obj,然后通过obj改变Name值.我们断言moq.Object.Name的值不为null,不幸的是,测试没有通过.

按我们理解obj和moq.Object应该是引用类型,所以obj值的改变会引起moq.object值的改变,然而实际情况却是我们一旦把moq.Objectm赋值给了obj,它们之间便脱离了关系.看来这样是行不通的.
如何解决这个问题呢,其实moq实例对象里面有一个SetupProperty方法,我们可以通过它来显示指定哪些属性会被跟踪,如果属性被跟踪,则它的变化就会被记录下来,而不像上面.
[Test]
public void BehaviorConfig()
{
var moq = new Mock<ISt>();
moq.SetupProperty(a => a.Name);
var obj = moq.Object;
obj.Name = "baidu";
Assert.NotNull(moq.Object.Name);
}
我们多加了一行代码,测试便可以通过了.
但是如果属性很多,这样一行一行几乎重复的代码挺烦的,moq实例里面还有一个SetupAllProperties方法,这样可以设置所有的属性都被跟踪.这样如果多条需要这个值,我们便不需要每次都mock它,而只需要给它重新赋值即可.
.net测试篇之Moq行为配置的更多相关文章
- .net测试篇之Moq框架简单使用
系列目录 Moq库简介及安装 Moq简介 Moq是.net平台下的一个非常流行的模拟库,只要有一个接口它就可以动态生成一个对象,底层使用的是Castle的动态代理功能. 它的流行赖于依赖注入模式的兴起 ...
- 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!
写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...
- Maven测试篇
maven的生命周期: 讲解Maven测试篇之前将首先介绍一下Maven生命周期的相关概念,如果你熟知这部分概念可以略过此小节内容. 大多数时候,我们在构建一个项目时,不外乎是对其进行清理.编译.测 ...
- .net测试篇之单元测试/集成测试神器Autofixture
autofixture简介 有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixt ...
- Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...
- jackson学习之十(终篇):springboot整合(配置类)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 如何让HTTPS站点评级达到A+? 还得看这篇HTTPS安全优化配置最佳实践指南
0x00 前言简述 SSL/TLS 简单说明 描述: 当下越来越多的网站管理员为企业站点或自己的站点进行了SSL/TLS配置, SSL/TLS 是一种简单易懂的技术,它很容易部署及运行,但要对其进行安 ...
- IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)
IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...
- NHibernate3剖析:Configuration篇之SessionFactory lambda配置
概览 在NHibernate3.0中.SessionFactory的Properties和Cache配置实现了流配置(fluent-configuration)和lambda表达式配置(lambda- ...
随机推荐
- 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之九
第11波-快速批量插入图片并保护纵横比不变 原文链接:https://www.jianshu.com/p/9a3d9aa7ba7e 修复了插入图片有纵向的图片时,插入后还是显示横向的情况. 第83波- ...
- springboot4自动配置的原理(浅层)
自动配置的原理(浅层) @Configuration //这是一个配置类 @EnableConfigurationProperties(HttpProperties.class)//启用Configu ...
- HashMap源码__tableSizeFor方法解析
tableSizeFor(int cap)方法返回不小于指定参数cap的最小2的整数次幂,具体是怎么实现的呢?看源码! /** * Returns a power of two size for th ...
- excel表数据生成定长txt数据
项目作业中需要造数据,从txt文件中获取定长数据,直接从txt中修改,会显得十分麻烦,于是便利用excel自带的vba写了一个小工具.效果如下: A1表示字段名,A2表示长度,A3是数据,也可以增加字 ...
- 我对微服务、SpringCloud、k8s、Istio的一些杂想
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- ES 22 - Elasticsearch中如何进行日期(数值)范围查询
目录 1 范围查询的符号 2 数值范围查询 3 时间范围查询 3.1 简单查询示例 3.2 关于时间的数学表达式(date-math) 3.3 关于时间的四舍五入 4 日期格式化范围查询(format ...
- SSM-员工管理系统Demo---带分页和校验(含源码)
页面展示: 前端JSP: <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- java中map,set的简单使用
package test2; import java.util.*; import static java.lang.System.out; public class test2 extends St ...
- 七分钟理解什么是 KMP 算法
本文是介绍 什么是 BF算法.KMP算法.BM算法 三部曲之一. KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程. 部分匹配表 .next数组 进行介绍,如果理解了这三 ...
- Laravel 命令行工具之多线程同步大批量数据 DB连接混乱 解决方案
记一次大批量数据的多进程同步 背景:因为公司的用户标识不完整,所以需要从集团同步一次用户标记数据,用户数据来源是微信,数量级为一百五十万,集团用户数量级为六百万 方案确定下来是集团开了一个查询接口,访 ...