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. 期望可以作用于Mock和Stub,但通常用于Mock对象,实现由两种方式:
    • 先执行Expected,再执行Replay
    • Using(*.Record()){执行Expected}
      Mock object Expection[Test]
      public void Analyze_TooShortFileName_ErrorLoggedToService()
      {
      MockRepository mocks = new MockRepository();
      IWebService simulatedService =
      mocks.StrictMock<IWebService>();
      using(mocks.Record())
      {
      simulatedService
      .LogError("Filename too short:abc.ext");
      }
      LogAnalyzer log =
      new LogAnalyzer(simulatedService);
      string tooShortFileName="abc.ext";
      log.Analyze(tooShortFileName);
      mocks.Verify(simulatedService);
      }
  6. Strict Mock Object 与 NonStrict Mock Object
  • Strict mock object:mock对象只能以期望中的参数调用期望方法,调用其他方法或者以不同参数调用期望方法,都会抛异常,根据Mock框架的实现可能在方法调用时抛出也可能在verify时抛出异常
  • NonStrict mock object(推荐使用):mock对象可以调用自己的任何方法。只有期望方法没被以指定参数调用时nonstrict mock object才会使test失败,并且只有在verify时才能知道期望方法是否被调用
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的输入参数是什么都返回给 定值
参数限制,放在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
对象的属性作参数:

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

表示只有当属性IsSomethingICareAbout为True时才返回指定值
Return()返回一个简单的值,可以用Do()提供完整实现,可以定义委托并调用,也可以用lamda表达式
_mockDAO.Stub(dao => dao.GetRecordFromDatabase(0))
             .IgnoreArguments()
             .Repeat.Any()
             .Do((Func<int, ImportantData>)(input => new ImportantData
                                                            {
                                                                Name = "Orignal Name",
                                                                RecordId = input
                                                            }));
 
Throw(Exception):抛出一个异常 Testing Non-Public Members:
    • 在要测试的assembly的AssemblyInfo.cs文件中添加两个InternalsVisibleToAttributes,one for unit test assembly,one for Rhino.Mocks,强签名的文件必须制定public key
posted on 2014-09-10 21:30 哨兵 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/phenixyu/p/3965194.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值