Moq & RhinoMocks

使用Mock对象进行测试一般都会有以下三个关键步骤:

  1. 使用接口来描述需要测试的对象
  2. 为实际的产品代码实现这个接口
  3. 以测试为目的,在Mock对象中实现这个接口

在使用Mock对象的过程中,充分体现出了“面向接口编程”的设计原则,同时也促成类的良好设计。

自行实现Mock对象是相当繁琐的工作,让人幸运的是,在.NET世界中有多个优秀的Mock框架可以供大家选择,目前最常使用的无非MoqRhino Mocks这两个框架。两者的最新版本在Mocking API方面的用法已日趋一致,都依托Lambda表达式、泛型和扩展方法做了很大改进,目标都是让Mock对象以一种更自然的方式与多个单元测试框架进行集成,以一种清晰的语法来描述期望值、参数约束、返回值等,极大的方便开发者的使用。

由于Moq和Rhino Mocks都使用了Castle DynamicProxy这个类库动态生成代理类,因此对需要Mock的对象有一定的限制:所测试的方法必须是virtual类型。

下面就用一个例子来看看两者的不同实现(这个例子摘自Moq源代码包中的Samples,只是略做了些修改以便于展现两者的特点):

需要进行测试的对象如下示之:

展开

下面是用这两个Mock框架分别实现的单元测试代码:

Moq 4.0 Rhino Mocks 3.6
[Test]
public void TestPresenterSelection() {
// arrange
var mView = new Mock<IOrdersView>();
var mRepository = new Mock<IRepository<Order>>();
var presenter = new OrdersPresenter(mView.Object, mRepository.Object);
// check that the presenter has no selection by default
Assert.Null(presenter.SelectedOrder); // raise event
mView.Raise(io => io.OrderSelected += null,
new OrderEventArgs { Order = new Order("moq", 50) }); // assert
Assert.NotNull(presenter.SelectedOrder);
Assert.AreEqual("moq", presenter.SelectedOrder.ProductName);
}
[Test]
public void TestPresenterSelection() {
// arrange
var mView = MockRepository.GenerateMock<IOrdersView>();
var mRepository = MockRepository.GenerateMock<IRepository<Order>>();
var presenter = new OrdersPresenter(mView, mRepository);
// check that the presenter has no selection by default
Assert.Null(presenter.SelectedOrder); // raise event
mView.Raise(io => io.OrderSelected += null, null,
new OrderEventArgs { Order = new Order("moq", 50) }); // assert
Assert.NotNull(presenter.SelectedOrder);
Assert.AreEqual("moq", presenter.SelectedOrder.ProductName);
}
[Test]
public void TestRetrieveOrders() {
// arrange
var mView = new Mock<IOrdersView>();
var mRepository = new Mock<IRepository<Order>>();
var presenter = new OrdersPresenter(mView.Object, mRepository.Object); List<Order> defaultOrders = new List<Order>
{ new Order("moq"), new Order("RhinoMock") }; mRepository.Setup(r => r.FindAll()).Returns(defaultOrders); // exercise mocks
presenter.OnInit();
// assert
mView.VerifySet(v => v.Orders = defaultOrders);
}
[Test]
public void TestRetrieveOrders() {
// arrange
var mView = MockRepository.GenerateMock<IOrdersView>();
var mRepository = MockRepository.GenerateStub<IRepository<Order>>();
var presenter = new OrdersPresenter(mView, mRepository); List<Order> defaultOrders = new List<Order>
{ new Order("moq"), new Order("RhinoMock") }; mRepository.Stub(ir => ir.FindAll()).Return(defaultOrders); // exercise mocks
presenter.OnInit();
// assert
mView.AssertWasCalled(v => v.Orders = defaultOrders);
}

Conclusion

通过上面的实例我们可以很容易看出两者的Syntax与API都非常接近,使用两者任何一个都能方便实现你的测试目的。

References

  1. QuickStart - Moq
  2. Ayende@Wiki - Rhino Mocks 3.5
  3. Daniel Cazzulino's Blog - Why do we need yet another NET mocking framework

C#

Event Broker: 通过发布事件源和订阅事件源来完成对象之间的协作
摘要: 在实际应用中,我们可以使用EventBroker来进行发布和订阅事件通知以实现对象间的通信。阅读全文

posted @ 2011-06-16 21:52 hans.hu 阅读(322) | 评论 (0) 编辑

趣味编程(一)
摘要: 最近遇到的几个编程小实例。阅读全文

posted @ 2010-10-29 21:51 hans.hu 阅读(369) | 评论 (4) 编辑

行为驱动开发之道
摘要: 介绍了行为驱动开发(Behavior Driven Development)常用的两个框架:SpecUnit与MSpec。 阅读全文

posted @ 2010-06-18 16:22 hans.hu 阅读(1127) | 评论 (0) 编辑

Dependency Injection Frameworks
摘要: 本人前一段时间整理好的、目前比较常用的IoC容器,在此做个记录以供日后参考使用。阅读全文

posted @ 2010-06-15 09:01 hans.hu 阅读(520) | 评论 (0) 编辑

Moq & RhinoMocks
摘要: 在.NET世界中有多个优秀的Mock框架可以供大家选择,目前最常使用的无非Moq与Rhino Mocks这两个框架。阅读全文

posted @ 2010-06-14 10:29 hans.hu 阅读(1870) | 评论 (2) 编辑

Windows Live Writer 插件
摘要: 本人开发的Windows Live Writer两个小插件(附源代码)。阅读全文

posted @ 2009-08-15 08:40 hans.hu 阅读(1948) | 评论 (17) 编辑

循序渐进学Boo - DSL篇
摘要: 本系列的终篇,在前几篇Boo文章的基础之上,本文着重介绍Boo与C#的混合编程对DSL的实现。 阅读全文

posted @ 2009-08-09 16:48 hans.hu 阅读(2162) | 评论 (4) 编辑

从一个小实例开始 - Boo开篇
摘要: Boo是一个类似Python语法、静态类型、运行在CLR之上的面向对象语言,它有一个强大的编译器扩展能力和更容易构建DSL的特性。本篇通过一个实例向大家介绍这门基于CLR的语言,希望能有越来越多的人关注Boo!阅读全文

posted @ 2009-04-14 11:41 hans.hu 阅读(2416) | 评论 (10) 编辑

 
分类: C#
标签: MoqRhino Mocks

Moq & RhinoMocks的更多相关文章

  1. Moq 和RhinoMocks

    Moq & RhinoMocks 使用Mock对象进行测试一般都会有以下三个关键步骤: 使用接口来描述需要测试的对象 为实际的产品代码实现这个接口 以测试为目的,在Mock对象中实现这个接口 ...

  2. NUnit3 Test Adapter vs2015

    NUnit的安装 前言:NUnit是什么? NUnit 是一个单元测试框架,专门针对于.NET来写的.NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NE ...

  3. Moq 和 RhinoMocks

    我们在做单元测试的时候,利用mock可轻松构建出测试需要的类或接口,而不需要编写繁琐的测试代码. .net 下我知道Moq与Rhino Mocks这两个框架. Moq 网上介绍的比较多. Rhino ...

  4. Moq 测试 属性,常用方法

    RhinoMock入门(7)——Do,With和Record-playback 摘要: (一)Do(delegate)有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在 ...

  5. Moq基础

    一.概念 Moq是利用诸如Linq表达式树和Lambda表达式等·NET 3.5的特性,为·NET设计和开发的Mocking库.Mock字面意思即模拟,模拟对象的行为已达到欺骗目标(待测试对象)的效果 ...

  6. 单元测试与Moq

    这个篇幅里面,记录单元测试与Moq模拟包的知识点. 单元测试 每一个模块,都应该有对应的单元测试.单元测试可以保证你的代码准确性,大大减少出现BUG的几率.一个好的单元测试,也是重构代码必不可少的部分 ...

  7. moq 的常用使用方法

    测试方法                             Console.WriteLine(mock.Object.GetCountThing()); 匹配参数   mock.Setup(x ...

  8. 单元测试中使用Moq对EF的DbSet进行mock

    刚用上Moq,就用它解决了一个IUnitOfWork的mock问题,在这篇博文中记录一下. 开发场景 Application服务层BlogCategoryService的实现代码如下: public ...

  9. 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)

     作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本 ...

随机推荐

  1. 沃森Mysql数据库修复工具

    华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发.主要针对Mysql数据库损坏的恢复. 本程序可用于因为各种误操作而导致数据丢失的恢复,以及因为断电.陈列损坏.硬盘坏道等各种原因导致数据库 ...

  2. TCO14 2C L2: CliqueGraph,graph theory, clique

    称号:http://community.topcoder.com/stat?c=problem_statement&pm=13251&rd=16017 參考:http://apps.t ...

  3. Apache conf文件配置个人总结

      其实说到conf文件的配置,网上那必定是大堆大堆的,故今儿写着篇小博文,也只是做个总结,至于分享的价值吗,如果对屏幕前的你有用,我也很乐意啦.   首先,我们要找到Apache安装目录,我的是Ap ...

  4. Matlab学习第二天 利用插值

    插入值一切手段: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQ5MjI1Nw==/font/5a6L5L2T/fontsize/400/fi ...

  5. ThinkPHP 3.2 开放 cache注缓存,过滤非法字符

    打开缓存配置文件 /Application/Common/conf/cache.php源代码如下面: <?php return array( //'配置项'=>'配置值' 'LAYOUT_ ...

  6. Jquery()核心函数的7个重载方法

    (1) jquery() 该函数返回一个空的jQuery对象.在jQuery1.4以后的版本中,改函数返回一个空的jQuery对象.在之后的版本中,该函数会返回一个包含document节点的对象. ( ...

  7. 多线程——@synchronized(object)

    @synchronized 的作用是创建一个相互排斥锁,保证此时没有其他线程对self对象进行改动.这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其他线程訪问,起到线程的保 ...

  8. Windows 10技术布局,谈微软王者归来

    Windows 10技术布局,谈微软王者归来 每个时代都有王者,王者的成功,往往是因为恰逢其时地发布了一个成功的产品(具有里程碑意义,划时代的产品).Windows 95的成功标示着微软是PC时代的王 ...

  9. Socket 学习(三)

    前2节,说的是 Server 与 Client 的数据交互.服务端IP.端口固定,客户端 网服务端发送消息的时候,他的Socket对面被服务端获取到了,而且链接没有中断,他当然可以很容易回复信息. 现 ...

  10. 网站静态化处理—web前端优化—中(12)

    网站静态化处理—web前端优化—中(12) Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原 ...