Rhino Mock

  1. Stub:用返回特定结果的代码替换方法,阻断对原来方法的调用
  2. Mock:A stub with an expectations than the method gets called.可以像stub一样伪造方法,阻断对原来方法的调用,expectation是说它不仅构造了这个方法,还期望你(必须)调用这个方法,返回给定的结果,如果没有调用,这个test就failed了
  3. Rhino.Mocks支持三种基本的Mock对象:
    • Strict Mock:需要提供替代的implementations for each method/property used on the mock,如果没有提供,就会抛异常.对应的函数为GenerateStrictMock<T>
    • Dynamic Mock:test中调用的method/property如果没有提供替代实现将会返回默认值,对应的函数为GenerateMock<T>
    • Partial Mock:只替换部分实现,如函数A中调用函数B,可以Mock函数B 返回特定值,A中的其他代码逻辑不变,对应的函数为GenerateStrictMock<T>
  4. Rhino.Mocks只能mock\stub virtual members of a real class,如:
    MockRepository mocks = new MockRepository();
    ArrayList list = mocks.CreateMock<ArrayList>();
    最好是mock\stub interface/abstract
  5. 预期的实现由两种方式:
    • 先执行Expected,再执行Replay
    • Using(*.Record()){执行Expected}
  6. stubOjbect.Stub().Return():在第一次调用时返回给定的值,下面的函数可以用在Stub和Return之间:
    • stubObject.Stub(Func).Repeat.Any().Return(provided value):每次调用都返回给定值
    • stubObject.Stub(Func).Repeat.Once().Return(provided value):第一次调用返回给定值
    • stubObject.Stub(Func).Repeat.Times(10).Return(provided value):前10次调用返回给定值
    • stubOjbect.Stub(Func).IgnoreArguments().Return(provided value):不管Func的输入参数是什么都返回给 定值
  7. 参数限制,放在Stub和Return函数中间:
    • Arg<int>.Is.GreaterThanOrEqual(0)
    • Arg<decimal>.Is.NotEqual(0)
    • Arg<List<string>>.List.ContainsAll(new List<string>("foo","bar"))
    • Arg<Object>.Is.NotNull
    • Arg<Object>.Is.Anything
  8. 对象的属性作参数:

    _mockDAO.Stub(x => x.SomeMethod(myObject)).Constraints(Property.Value("IsSomethingICareAbout", true) .Return("foo");

    表示只有当属性IsSomethingICareAbout为True时才返回指定值

  9. Return()返回一个简单的值,可以用Do()提供完整实现,可以定义委托并调用,也可以用lamda表达式
  10. _mockDAO.Stub(dao => dao.GetRecordFromDatabase(0))
                 .IgnoreArguments()
                 .Repeat.Any()
                 .Do((Func<int, ImportantData>)(input => new ImportantData
                                                                {
                                                                    Name = "Orignal Name",
                                                                    RecordId = input
                                                                }));
     
  11. Throw(Exception):抛出一个异常
  12. Testing Non-Public Members:
    • 在要测试的assembly的AssemblyInfo.cs文件中添加两个InternalsVisibleToAttributes,one for unit test assembly,one for Rhino.Mocks,强签名的文件必须制定public key
时间: 2024-10-11 07:48:45

Rhino Mock的相关文章

单元测试之Stub和Mock

单元测试之Stub和Mock FROM:http://www.cnblogs.com/TankXiao/archive/2012/03/06/2366073.html 在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,记录Log, 文件系统 之类的). 而我们没法控制这些外部依赖的对象.  为了解决这个问题,我们需要用到Stub和Mock来模拟这些外部依赖的对象,从而控制它们 阅读目录 实例 设计测试用例 什么是外部依赖 Stub和Mock的相同

持续集成方案

大纲 构建 版本控制 部署 单元测试 架构文档化 命名约定 数据库伸缩性 自动化 反馈 实践 引言: 持续集成的前身: 在使用持续集成之前,很多开发团队都是用每日构建(nightly build).当时,微软使用这个实践很多年了.谁破坏了构建,就要负责监视后续的构建构成,直至发现下一个破坏了构建的人. 为什么要使用持续集成? 对于大多数项目来说,采纳持续集成实践是向高效率和高质量迈进的一大步.它保证那些创建大型复杂系统的团队具有高度的自信心和控制力.一旦代码提交引入了问题,持续集成就能为我们提供

新.Net架构必备工具列表

N多年前微软官网曾发了.Net下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了.而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要,工具与工具之间是否有联系?等等,阐述得并不明确. 这里,我想从另一个角崖,重新归纳一个更新的更实际的武器库.更新,是因为有很多最近几年才出来的工具/框架库,更实际,是因为我自己的项目就完全依赖使用. Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列在这.实际上,现在也有一个

Dynamics CRM 编程之单元测试技术: Microsoft Fake Framework

对于基于复杂的框架进行编程,最难的地方并不是编写代码,而是怎么快速有效的去调试出错的代码,怎么高效精准的完成代码的单元测试.就拿Dynamics CRM Plugin的编写来看,编写一个上千行代码的插件不是一件很难的事情,但是,如果把这上千行代码调试完成并让它行之有效的按我们的目的精准的进行呢?这也是初级技术员和高级技术员的核心差距. 今天给大家带来一篇关于Plugin的单元测试文章,博主2年前撰写过另外一篇类似的单元测试文档,使用的是Rhino Mock技术.但是今天我们要使用的技术,则是Mi

无接口.NET代码的单元测试

最近工作上的活就是研究一下如何为一个历史代码工程添加单元测试,已经做完了,就想抛砖引玉和大家分享一下结果,听听大家的反馈. 该工程目前还是VS2010下的C#代码,虽然大量使用了继承,封装和多态,但对接口的应用非常少,所以基本上没办法用常见的Mock框架(如Moq, Rhino Mock,等)来写单元测试. 考虑下来,解决方案无非两种:一是重构现有代码,通过接口(interface)来实现依赖注入(Dependency Injection, DI);二是寻找无需通过接口直接支持虚拟实体类的Moc

转 .Net架构必备工具列表

Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列在这.实际上,现在也有一个开源的IDE开发环境发展也不错,叫SharpDevelop.我并没有仔细看,不敢妄评.而我因要用到之后会讲的Resharper,也迫使我只能用VS. Resharper ---重构必备 无论是从其名称,还是实际功能,Resharper绝对称得上利器,一旦你用熟了你就再也离不开它了.我去年换工作,很大一部分原因就是因为原单位不让我使用Resharper.几个面试,我也总在重复提出我这一要求.直至最新版

Net架构必备工具列表

N 多年前微软官网曾发了.Net 下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了.而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要,工具与工具之间是否有联系?等等,阐述得并不明确. 这里,我想从另一个角崖,重新归纳一个更新的更实际的武器库.更新,是因为有很多最近几年才出来的工具/框架库,更实际,是因为我自己的项目就完全依赖使用. Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列在这.实际上,现在也有

我的.Net武器库 ------ 新.Net架构必备工具列表

工欲善其事,必先利其器. N多年前微软官网曾发了.Net下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了.而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要,工具与工具之间是否有联系?等等,阐述得并不明确. 这里,我想从另一个角崖,重新归纳一个更新的更实际的武器库.更新,是因为有很多最近几年才出来的工具/框架库,更实际,是因为我自己的项目就完全依赖使用. Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列

TDD学习笔记【六】一Unit Test - Stub, Mock, Fake 简介

这篇文章简介一下,如何通过 mock framework,来辅助我们更便利地模拟目标对象的依赖对象,而不必手工敲堆只为了这次测试而存在的辅助类型. 而模拟目标对象的部分,常见的有 stub object, mock object, fake object,本文也会简单介绍一下三者的不同点,并且通过实例,帮助读者快速的 pick up 实战经验. 安装与范例说明 本文的范例,使用 VS2013 为开发工具,mock framework 则是使用 Rhino.Mocks,通过 IoC 的方式,由构造