【Pro ASP.NET MVC 3 Framework】.学习笔记.4.MVC的主要工具-使用Moq
在之前的例子中,我们创建了FakeRepository类来支持我们的测试。但是我们还没有解释如何穿件一个真实的repository实现,我们需要一个替代品。一旦我们有一个真的实现,我们可能不会再用它,因为它把我们的测试环境变得复杂。
FakeRepository类,是IProductRepository接口的伪实现。我们创建伪实现,并手动添加特别的参数,使得FakeRepository类手动的仿制品。Moq是一个框架,让我们仿制变得快速,简单,容易。
1 将Moq添加到测试项目,而不是应用程序项目
2 使用Moq创建一个Mock
使用mocking工具的好处是,我们能创建一个为满足测试中的功能定制的Mocks。这意味着我们最终不会得到太复杂的mock实现。在一个真实的项目中,不像这些简单的例子。我们能容易地抵达舞台,mock实例需要它自己的测试,因为它包含足够的代码。我们能手工创建一些mock,为了使它们生效,我们需要移动循环代码到基类,我们正确的返回会变得更复杂。有两个舞台需要使用Moq创建mock,第一个创建一个新的Mock<T>,这个T是我们想要mock的。
第二个舞台是配置实现要展示的行为。Moq会自动实现我们在类型中给它的所有的方法和属性,它会使用类型的默认值。例如,IProductRepository.GetProducts方法会返回一个空的IEnumerable<Product>。要改变Moq实现一个类型成员的方法,我们需要使用Setup方法。
3 使用Moq方法选择器
第一个参数是被选择的方法。Moq使用Linq和Lambda表达式。当我们调用Setup方法,Moq传递接口。当我们想要为GetProducts方法定义一个行为,我们可以这样做
我们不需要知道它内部是怎样工作的,只需要照着做就行了。GetProduct方法容易处理,是因为它没有参数。如果我们想要处理携带参数的方法,我们需要考虑第二个元素:参数过滤。
4 使用Moq的参数渗透
要为所有可能的参数设置相应,可以使用Moq提供的It类。
It类定义一些方法,配合一般型参数使用。我们调用IsAny方法,使用string作为一般类型。这告诉Moq,当ProcessMessage方法伴着任何string值被调用,它会返回相应Message Recived。
| Method | Description | 
| Is<T>() | 匹配基于指定的条件 | 
| IsAny<T>() | 当参数是任何T类型的实例时匹配 | 
| IsInRange<T> | 当参数在指定值之间时匹配 | 
| IsRegex | 当匹配指定的正则表达式时匹配 | 
Is<T>方法时最灵活的,因为它让我们提供一个条件。
当string参数是hello或bye时,返回Message Recived。
5 返回一个结果
当我们配置行为时,我们也定义它被触发时的返回方法。上个例子中,Returns方法链式地Setup方法。我们也可以使用传递给mocked方法的参数,给Return方法,让output基于input。
6 使用Moq的单元测试
一旦配置好必须的行为,你可以通过Mock.Object属性得到mocked的实现。
为所有测试准备公共数据。单元测试的属性:
| Attribute | Description | 
| ClassInitialize | 在类中的单元测试被执行之前调用。必须应用给静态方法 | 
| ClassCleanup | 在类中的所有方法执行完成后调用。必须应用给静态方法 | 
| TestInitialize | 在每个测试执行前调用 | 
| TestCleanup | 在每个测试执行后调用 | 
VS只看这些属性,方法的名字不重要。
7 使用Moq验证
当每个Product对象被处理时,UpdateProduct方法会被调用。在FakeRepository类中,我们我们定义了一个自增的属性。我们能用Moq以更优美的方式实现相同的效果。
使用参数渗透,我们能验证UpdateProduct方法,恰好被每个Product对象调用一次。
【Pro ASP.NET MVC 3 Framework】.学习笔记.4.MVC的主要工具-使用Moq的更多相关文章
- Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具
		每个MVC程序员的军火库中,都有这三个工具:一个依赖注入(DI)容器,一个单元测试框架,一个模拟工具. 1.准备一个示例项目 创建一个ASP.NET MVC Web Application的Empty ... 
- Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具
		2.5.创建链式依赖 当你请求Ninject创建一个类型,它检查该类型的依赖是否声明.它也会检查该依赖是否依赖其他类型.如果这里有附加依赖,Ninject自动解决他们,并创建请求的所有类的实例.正是由 ... 
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
		http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ... 
- ASP.NET Core Web开发学习笔记-1介绍篇
		ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ... 
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
		不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ... 
- MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom
		<MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ... 
- MVC缓存OutPutCache学习笔记  (一) 参数配置
		OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ... 
- Entity Framework 学习笔记(2)
		上期回顾:Entity Framework 学习笔记(1) Entity Framework最主要的东西,就是自己创建的.继承于DbContext的类: /// <summary> /// ... 
- Entity Framework学习笔记
		原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html Entity Framework学习笔记——错误汇总 之前的小项目做完了,到了总结经验和 ... 
- ADO.NET Entity Framework学习笔记(3)ObjectContext
		ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转] 说明 ObjectContext提供了管理数据的功能 Context操作数据 AddObject ... 
随机推荐
- Unicode 编码概念
			Unicode 编码概念 Unicode 编码可能是我们日常开发中接触最多的字符编码方式之一,其它常见的中文编码方式还包括 GB2132-80 / GB13000 / GBK / GB18030 .在 ... 
- I2C实时时钟rx-8025板卡实际应用
			rx-8025是片外I2C实时时钟,其应用于9260板卡方法如下.总体思想是配置内核添加驱动(I2C驱动,内核已提供的很完备),板级文件添加设备,添加设备文件以应用程序操作. 1. 配置内核 1)I2 ... 
- NETBEANS + XDEBUG + IIS PHP 代码 调试 DEBUG
			参考: http://domainwebcenter.com/?p=936 http://www.sitepoint.com/debugging-and-profiling-php-with-xdeb ... 
- debug 使用lldb
			http://www.zddhub.com/memo/2015/12/20/lldb-golang-debug/ go build -gcflags "-N -l" -o test ... 
- Java常用锁机制简介
			在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ... 
- ps 简介
			1. ps 简介ps 命令就是最根本相应情况下也是相当强大地进程查看命令.运用该命令可以确定有哪些进程正在运行和运行地状态. 进程 是否结束.进程有没有僵死.哪些进程占用了过多地资源等等.总之大部分信 ... 
- G面经prepare: Android Phone Unlock Pattern
			1 2 3 4 5 6 7 8 9 只有中间没有其他键的两个键才能相连,比如1可以连 2 4 5 6 8 但不能连 3 7 9 但是如果中间键被使用了,那就可以连,比如5已经被使用了,那1就可以连9 ... 
- [Linux]可用于管道操作的命令
			管道命令——| command1 | command2 | command3 注:管道命令必须能够接受来自前一个命令的数据成为standard input继续处理. cut 将一段信息的某一段切出来, ... 
- Java基础(1):Switch语句注意的5个地方
			不得不说的几点小秘密: 1. switch 后面小括号中表达式的值必须是整型或字符型 2. case 后面的值可以是常量数值,如 1.2:也可以是一个常量表达式,如 2+2 :但不能是变量或带有变量的 ... 
- URAL 1139 City Blocks(数论)
			The blocks in the city of Fishburg are of square form. N avenues running south to north and Mstreets ... 
