使用Nmock单元测试 .NET 业务对象

原创 2011年06月03日 14:39:00

 

使用Nmock单元测试 .NET 业务对象

Nmock是在开发环境下测试复杂业务对象的唯一方式

理解单元测试问题

在一个测试驱动的开发环境(test-driven developmentenvironment)下,为复杂的业务对象编写单元测试脚本很困难,因为,业务对象可能外部依赖(高耦合,high coupling)很多其他对象。

有时,对于有限的项目预算来说,建立开发环境,并配置它们的单元测试,不大可能。但是开发人员可以通过 mock 测试对象解决这个问题。

通过创建 mock 业务对象,而不是你复杂业务对象的真正实现,你可以一次测试一个类。Mock 对象是模拟对象,复制你的业务对象的行为,你可以在你真正的单元测试脚本中使用 这些mock 对象。

使用 Nmock

很少有微软 .NET 支持的模拟(mock)测试框架——Nmock 就是其中之一。Nmock 也可以很容易与 Nunit 测试框架集成。Nmock 是免费的。

Nmock是一个独特的具有以下特征的模拟测试库:

1)       同其他单元测试框架一样,开发人员需要定义期望。你期待什么作为输出

2)       模拟对象基于实现的接口,本质上是动态的。

3)       如果实际的输出与预期不符合,那么你的测试用例将失败。

4)       错误信息显示错误的详细描述。

安装 Nmock 测试环境

为了开发示例应用程序,使用 VisualStudio 2008 .NET 框架3.5。单元测试使用 NUnit 2.5.10。在安装NUnit msi包之后,除了能看到 nunit.framework.dll的引用,还能看到nunit.mocks.dll,但本示例项目中只引用 nunit.framework.dll

下载 Nmock 库,解压后,会得到一些 DLL 文件。在本示例项目中,只增加 NMock2.dll 的引用。本例演示常见的长度和距离的转换系数,将一个长度计量单位转换到另一个的转换系数。例如,米到英尺的转换系数是3.28

1, 首先创建一个C#控制台程序。

2, 新建接口 IconversionService,代码如下:

 

说明:GetConversionRate 方法返回转换因子。

3, 新建类 ConversionServices,代码如下:

 

4, 新建ConvertTotalValue 类,代码如下:

 

说明:ConvertTotalValue 类里有一个只读的实例 IconversionService 接口,在其构造函数里实例化。那么这个实例就可以看作是一个 mock

使用Nmock库单元测试 .NET 业务对象(比较)

下面,为了演示一般的单元测试(使用 NUnit 库)与模拟测试(使用 Nmock库 )的区别,在 ConversionServicesTest  类创建两个不同的测试方法。

ShowCorrectLengthConversion 方法中,使用一个 ConversionServices类的对象,并调用GetConversionRate 方法获得转换系数。如果你 debug 一下 GetConversionRate方法,那么会发现程序的控制被转交给重构的GetConversionRate 函数。

而在ShowCorrectLengthConversionWithMock 方法中,没有创建任何 ConversionServices类的实例获得转换系数。取而代之的是真正的实现,创建一个 IconversionService 接口的mock实例,用来在计算转换的值。通过Nmock库函数创建一个模拟(mock)对象。请参考下面的代码:

 

Expect.Once.On将创建一个模拟(mock)实例。所以,调用参数为“MET”和“FT”的GetConversionRate方法时,会返回转换系数3.28。下面的代码显示完整的模拟测试代码:

 

参考资料:

http://www.nmock.org/ 
http://www.devx.com/DevXNet/Article/45071 
http://msdn.microsoft.com/en-us/magazine/cc163904.aspx 

 

.Net单元测试之NMock

.Net单元测试之NMock NMock是一款.NET平台下的基于动态代理的Mock模拟对象类库,用于C#开发。Mock对象使测试更简单,它测试单个组件或单个类时不需要其它所有组件真正实现。也就是说...
  • xifeijian
  • xifeijian
  • 2013年03月30日 13:25
  • 5097

单元测试-使用nmock测试你的.NET代码(3)

使用模拟对象来解决问题传统上,单元测试的术语已经包含了驱动和存根(stub)的概念。在你作为一个软件开发者的生涯中,你或许对你所需要测试的每个模块都创造相当多的这些驱动和存根。驱动是为了访问库中的属性...
  • gamix
  • gamix
  • 2004年12月17日 23:44
  • 887

单元测试-使用nmock测试你的.NET代码(1)

最近的工作都是在做单元测试,偶尔看到了这个被称为nmock的东西,找了半死也没找出一些关于它的文档,只在MSDN发现了一点资料,尝试着做一下翻译吧(两年多没碰了,肯定会有一些翻译的不好的地方)。原文地...
  • gamix
  • gamix
  • 2004年12月17日 23:38
  • 999

单元测试-使用nmock测试你的.NET代码(2)

理解单元测试中的困难在进行我为这篇文章所写的例子代码的旅程之前,有必要理解一下下面的难题:要进行单元测试的库有一个复杂的依赖集合。尽管最好是设计出具有最小限度的依赖集合的库,但有时候这是不切实际的,特...
  • gamix
  • gamix
  • 2004年12月17日 23:40
  • 910

图解VS.NET之单元测试

据说VS2005里即提供了测试功能,可是对于像我或者我们这样的开发人或团队真还没有进化到用测试这块。一直以来都是手工测试或等到用户发现问题。今天在网上找了一个介绍单元测试的WORD文档,按里面说的做了...
  • anyqu
  • anyqu
  • 2012年04月12日 16:04
  • 6075

NMock学习系列(三)--- NMock在DDD领域驱动的单元测试中的应用

介绍         领域驱动设计涵盖的知识点比较多,其中代码的架构、设计、编写基本上只占到其中的很小一部分,其它的大部分讲解的是需求的获取方式、项目的管理方式等知识。本篇就是针对这一小部分的知识点位...
  • Eye_cng
  • Eye_cng
  • 2015年04月14日 22:54
  • 726

NMock学习系列(一)--- 对象及数据库模拟介绍

介绍         单元测试是对一个系统的最小可测试单元的检查和验证,系统里关键点位的规则、关键的逻辑均可建立一个单元测试,但是对于一些存在不确定行为对象的测试或者数据库操作的测试不确定因素比较高,...
  • Eye_cng
  • Eye_cng
  • 2015年04月13日 23:17
  • 924

.NET 环境下进行单元测试

转载:http://www.cnblogs.com/IPrograming/archive/2012/12/31/NunitHelloWorld.html 单元测试入门——使用NUnit框架(...
  • ycl295644
  • ycl295644
  • 2015年03月26日 19:23
  • 1326

使用xUnit为.net core程序进行单元测试(上)

一. 导读为什么要编写自动化测试程序(Automated Tests)?可以频繁的进行测试可以在任何时间进行测试,也可以按计划定时进行,例如:可以在半夜进行自动测试。肯定比人工测试要快。可以更快速的发...
  • sD7O95O
  • sD7O95O
  • 2018年01月16日 00:00
  • 53

ASP.NET MVC 5 (八) Visual Studio单元测试

这里记录如何使用Visual Studio的内置单元测试准备示例 创建单元测试项目 添加项目引用 添加单元测试 第一个单元测试 添加其他单元测试 运行单元测试并发现错误 实现特性 测试并修正代码准备示...
  • github_37410569
  • github_37410569
  • 2017年02月17日 22:31
  • 1008
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Nmock单元测试 .NET 业务对象
举报原因:
原因补充:

(最多只允许输入30个字)