使用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项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)

在一般的函数调用情况下,我们都习惯性的将参数传入到某个被调用的方法,这可能就是我们考虑调用方法的惯用思维,但是现在的C#语言得到了很大的提升,我们可以很自然的使用委托来减少函数之间的参数依赖;有时候会...

.Net单元测试(四)——Mock对象

Why mock?       由于做单元测试针对大到具体类,小到某个方法的测试,试想一下:如果你要测的类或者方法,强依赖于另一个项目中的接口或是参数。例如在高校平台中,权限系统需要实现控制基础、考...

使用NUnit在.Net编程中进行单元测试

本文通过一个详实的例子,详细介绍了如何在C#中利用NUnit单元测试框架进行应用程序类的单元测试工作。 引言: 举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看...
  • jglie
  • jglie
  • 2011年10月24日 09:35
  • 403

[.NET]使用FactoryManager为遗留的静态方法作单元测试

当一个遗留的静态方法中使用了诸如依赖于数据库或WebService之类的外部资源时,为了确保单元测试快速的运行,可以使用FactoryManager来进行依赖分离,而如果是实例方法的话,则可以用构造函...
  • bclz_vs
  • bclz_vs
  • 2012年04月26日 09:35
  • 961

【ASP.Net MVC3 】使用Moq让单元测试变得更简单

http://www.cnblogs.com/techborther/archive/2012/01/10/2317998.html 前几天调查完了unity。现在给我的任务是让我调查Moq...

Moq .NET单元测试利器

  • 2016年03月29日 16:44
  • 981KB
  • 下载

Dot.NET单元测试艺术

  • 2016年07月03日 06:43
  • 33.6MB
  • 下载

.NET 单元测试样例 (NUnit工具)

转贴于:http://blog.csdn.net/cpcpc/article/details/6185946 使用NUnit在.Net编程中进行单元测试 引言: 举一...

.net单元测试

  • 2014年12月11日 14:12
  • 33.59MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Nmock单元测试 .NET 业务对象
举报原因:
原因补充:

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