Mock是模拟对象的一种技术。
... moq 的常用使用方法(推荐) ... 准备Mock IFoo 接口 var mock = new Mock(); // 配置准备模拟的方法,当调用接口中的DoSomething ...
基础教程 菜鸟教程(cainiaojc.com)HTML/CSSHTML基础教程HTML5基础教程HTML参考手册SVG教程CSS教程CSS参考手册CSS3教程Bootstrap教程JavaScriptJavaScript教程JavaScript参考手册jQuery教程AJAX教程JSON教程AngularJS教程ReactJS教程NodeJS教程服务端开发Python教程C++教程Golang教程C语言教程Java教程PHP教程Kotlin教程C#教程LinQ教程移动端Swift教程数据库SQL教程MongoDB教程SQLite教程经验笔记在线工具
所在位置
首页
经验笔记
正文
moq的常用使用方法(推荐)
Moq,就是Mockyou。
读音可以读成Mock~you。
是Mock框架的一种。
用于测试中的Mock测试。
Mock是模拟的意思。
Mock是模拟对象的一种技术。
测试方法
//准备MockIFoo接口
varmock=newMock();
//配置准备模拟的方法,当调用接口中的DoSomething方法,并传递参数"bing"的时候,返回true
mock.Setup(foo=>foo.DoSomething("ping")).Returns(true);
//方法的参数中使用了out参数
//outarguments
varoutString="ack";
//当调用TryParse方法的时候,out参数返回"ack",方法返回true,lazyevaluated
mock.Setup(foo=>foo.TryParse("ping",outoutString)).Returns(true);
//ref参数
varinstance=newBar();
//仅仅在使用ref调用的时候,才会匹配下面的测试
mock.Setup(foo=>foo.Submit(refinstance)).Returns(true);
//当方法返回值得时候,还可以访问返回的值
//这里可以使用多个参数
mock.Setup(x=>x.DoSomething(It.IsAny()))
.Returns((strings)=>s.ToLower());
//在被调用的时候抛出异常
mock.Setup(foo=>foo.DoSomething("reset")).Throws();
mock.Setup(foo=>foo.DoSomething("")).Throws(newArgumentException("command");
//延迟计算返回的结果
mock.Setup(foo=>foo.GetCount()).Returns(()=>count);
//在每一次调用的时候,返回不同的值
varmock=newMock();
varcalls=0;
mock.Setup(foo=>foo.GetCountThing())
.Returns(()=>calls)
.Callback(()=>calls++);
//第一次调用返回0,下一次是1,依次类推
Console.WriteLine(mock.Object.GetCountThing());
匹配参数
//任意值
mock.Setup(foo=>foo.DoSomething(It.IsAny())).Returns(true);
//提供的值必须匹配一个函数,lazyevaluated
mock.Setup(foo=>foo.Add(It.Is(i=>i%2==0))).Returns(true);
//匹配一个范围
mock.Setup(foo=>foo.Add(It.IsInRange(0,10,Range.Inclusive))).Returns(true);
//匹配正则表达式
mock.Setup(x=>x.DoSomething(It.IsRegex("[a-d]+",RegexOptions.IgnoreCase))).Returns("foo");
属性
//普通属性
mock.Setup(foo=>foo.Name).Returns("bar");
//多层的属性
mock.Setup(foo=>foo.Bar.Baz.Name).Returns("baz");
//期望设置属性的值为"foo"
mock.SetupSet(foo=>foo.Name="foo");
//或者直接验证赋值
mock.VerifySet(foo=>foo.Name="foo");
设置属性,以便自动跟踪它的值
//开始"tracking"属性的sets/gets
mock.SetupProperty(f=>f.Name);
//提供一个默认的值
mock.SetupProperty(f=>f.Name,"foo");
//现在,你可以:
IFoofoo=mock.Object;
//保存的值
Assert.Equal("foo",foo.Name);
//重新设置一个值
foo.Name="bar";
Assert.Equal("bar",foo.Name);
还可以准备所有的属性
mock.SetupAllProperties();
事件
//抛出一个事件
mock.Raise(m=>m.FooEvent+=null,newFooEventArgs(fooValue));
//多层的后代中的事件
mock.Raise(m=>m.Child.First.FooEvent+=null,newFooEventArgs(fooValue));
//当Submit方法被调用的时候,抛出一个事件
mock.Setup(foo=>foo.Submit()).Raises(f=>f.Sent+=null,EventArgs.Empty);
//抛出异常将会触发对象底层的行为
//你可能需要在后面进行断言处理
//抛出一个自定义的事件
publicdelegatevoidMyEventHandler(inti,boolb);
publicinterfaceIFoo{eventMyEventHandlerMyEvent;}
varmock=newMock();
...
//传递自定义的事件参数
mock.Raise(foo=>foo.MyEvent+=null,25,true);
回调
varmock=newMock();
mock.Setup(foo=>foo.Execute("ping"))
.Returns(true)
.Callback(()=>calls++);
//使用调用的参数
mock.Setup(foo=>foo.Execute(It.IsAny()))
.Returns(true)
.Callback((strings)=>calls.Add(s));
//使用泛型语法
mock.Setup(foo=>foo.Execute(It.IsAny()))
.Returns(true)
.Callback(s=>calls.Add(s));
//使用多个参数
mock.Setup(foo=>foo.Execute(It.IsAny(),It.IsAny()))
.Returns(true)
.Callback((i,s)=>calls.Add(s));
//调用之前和之后的回调
mock.Setup(foo=>foo.Execute("ping"))
.Callback(()=>Console.WriteLine("Beforereturns"))
.Returns(true)
.Callback(()=>Console.WriteLine("Afterreturns"));
验证
mock.Verify(foo=>foo.Execute("ping"));
//在验证失败的时候,提供自定义的错误提示信息
mock.Verify(foo=>foo.Execute("ping"),"WhendoingoperationX,theserviceshouldbepingedalways");
//从没有被调用的方法
mock.Verify(foo=>foo.Execute("ping"),Times.Never());
//至少调用过一次
mock.Verify(foo=>foo.Execute("ping"),Times.AtLeastOnce());
mock.VerifyGet(foo=>foo.Name);
//验证对属性的赋值.
mock.VerifySet(foo=>foo.Name);
//验证对于属性设置特定的值
mock.VerifySet(foo=>foo.Name="foo");
//验证匹配的参数
mock.VerifySet(foo=>foo.Value=It.IsInRange(1,5,Range.Inclusive));
自定义Mock行为
Mock的行为分为严格的Strict和宽松的Loose,默认为宽松的。
在严格模式下,使用任何没有被指定的行为,都将会抛出异常,宽松模式下,不会抛出任何异常,方法将会返回默认值或者空的数组等等。
varmock=newMock(MockBehavior.Strict);
如果没有重写基类的实现,默认将不会调用基类,在MockWeb/Html控件的是必须的。
varmock=newMock{CallBase=true};
创造自动递归的Mock,Mock对象对于它的任何成员将会返回一个新的Mock对象。
varmock=newMock{DefaultValue=DefaultValue.Mock};
//默认是DefaultValue.Empty
//现在这个属性将会返回一个新的Mock对象
IBarvalue=mock.Object.Bar;
//可以使用返回的Mock对象,后即对属性的访问返回相同的对象实例
//这就允许我们可以进行后继的设置
//setfurtherexpectationsonitifwewant
varbarMock=Mock.Get(value);
barMock.Setup(b=>b.Submit()).Returns(true);
中心化的Mock实例创建和管理:你可以在一个地方使用MockRepository创建和验证所有的Mock对象,设置MockBehavior,CallBse和DefaultValue约束。
varfactory=newMockFactory(MockBehavior.Strict){DefaultValue=DefaultValue.Mock};
//创建Mock对象
varfooMock=factory.Create();
//在创建的时候重写仓库的设置
varbarMock=factory.Create(MockBehavior.Loose);
//验证通过仓库创建的对象
factory.Verify();
其它
//用在测试用例的开始
usingMoq.Protected()
//测试中
varmock=newMock();mock.Protected()
.Setup("Execute")
.Returns(5);
//如果用到了参数匹配,必须使用ItExpr来代替It
//以后计划改进
mock.Protected()
.Setup("Execute",ItExpr.IsAny())
.Returns(true);
高级特性
//从Mock实例重新获得Mock对象
IFoofoo=//getmockinstancesomehow
varfooMock=Mock.Get(foo);
fooMock.Setup(f=>f.Submit()).Returns(true);
//实现多个接口
varfoo=newMock();
vardisposableFoo=foo.As();
//现在IFoomock已经实现了接口IDisposable:)disposableFoo.Setup(df=>df.Dispose());
//定制匹配
mock.Setup(foo=>foo.Submit(IsLarge())).Throws();...
publicstringIsLarge()
{
returnMatch.Create(s=>!String.IsNullOrEmpty(s)&&s.Length>100);
}
以上所述是小编给大家介绍的moq的常用使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
在此也非常感谢大家对菜鸟教程(cainiaojc.com)网站的支持! 声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。
如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#cainiaojc.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
基础教程
HTML基础教程
HTML5基础教程
HTML参考手册
SVG教程
CSS教程
CSS参考手册
CSS3教程
Bootstrap教程
JavaScript教程
JavaScript参考手册
jQuery教程
AJAX教程
JSON教程
AngularJS教程
ReactJS教程
NodeJS教程
Python教程
C++教程
Golang教程
C语言教程
Java教程
PHP教程
Kotlin教程
C#教程
LinQ教程
Swift教程
SQL教程
MongoDB教程
SQLite教程
猜你喜欢
JS中substring与substr的用法
在同一台服务器上配置多个Tomcat的方法
Spring搭配Ehcache实例解析
Android——Androidlint工具项目资源清理详解
PHP获取input输入框中的值去数据库比较显示出来
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
AndroidService服务不被停止详解及实现
Java多线程-线程的同步与锁的问题
Android中Fragment的解析和使用详解
PHPforeach遍历多维数组实现方式
微信小程序网络请求(GET请求)详解
php数据库操作model类(使用__call方法)
virtualbox中ubuntu和windows共享文件夹设置教程
一个合格JAVA软件工程师应该具备什么
SQL中STUFF用法
moq的常用使用方法(推荐)
微信小程序POST请求(网络请求)详解及实例代码
php实现的简单数据库操作Model类
微信小程序swiper组件轮播图详解及实例
iOS自定义提示弹出框实现类似UIAlertView的效果
input框中的name和id的区别
Android中FTP上传、下载的功能实现(含进度)
PHP中串行化用法示例
Python进阶篇之字典操作总结
Android多级树形列表控件
Copyright©2021菜鸟教程cainiaojc.com