moq 的常用使用方法(推荐) - 经验笔记 - 菜鸟教程

文章推薦指數: 80 %
投票人數:10人

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



請為這篇文章評分?