【问题标题】:RhinoMocks mock method without returnRhinoMocks 没有返回的模拟方法
【发布时间】:2015-06-15 12:29:46
【问题描述】:

我是嘲笑的新手。我需要模拟方法(它没有返回值)。我找不到任何关于如何模拟方法的示例。我需要模拟ITempDa.Import 方法。

 var stub = MockRepository.GenerateStub<ITempDA>();
 stub.Stub(x => x.Import(param1)). ???


 public void MockedImport() {
    // some processing here
 }

ITempDa.Import 应该被模拟,而应该调用一些内部方法“MockedImport”。

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    正如@JamesLucas 所说,您不需要使用Return() 方法(仅当您的方法不是void 时才应使用此方法。

    在这种情况下,您应该使用Do() 方法:

    var stub = MockRepository.GenerateStub<ITempDA>();
    stub.Stub(x => x.Import(Arg<object>.Is.Anything))
                    .Do(new Action<object>(o => MockedImport()));
    

    或者如果MockedImport 的参数与Import 相同:

    stub.Stub(x => x.Import(Arg<object>.Is.Anything))
                    .Do(new Action<object>(MockedImport);
    

    当被测方法调用你的假并且你想拦截执行时,你应该使用WhenCalled 方法(执行某些东西+更改返回值/更改参数/执行其他步骤等...)。使用Do 而不是WhenCalled 的另一个原因是,您的代码变得更具可读性。

    通常我不建议使用IgnoreArguments 方法。原因很简单,你测试方法的行为。当某些事情违反方法行为时,测试应该失败。 IgnoreArguments 轻松隐藏东西。但是,如果调用参数不重要,请执行以下操作:

    stub.Stub(x => x.Import(null))
                    .IgnoreArguments()
                    .Do(new Action<object>(o => MockedImport()));
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您不需要 Return() 调用,因为该方法返回无效。如果你想拦截调用并对模拟操作执行一些逻辑,那么使用WhenCalled。在这种情况下,也可以忽略 Stub 中的参数并处理 WhenCalled 表达式中的所有内容。例如

       var stub = MockRepository.GenerateStub<ITempDA>();
       stub.Stub(x => x.Import(null))
           .IgnoreArguments()
           .WhenCalled(invocation =>
           {
               var arg = invocation.Arguments[0] as ...;
               // etc
           });
      

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 2011-01-02
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多