没有 return 的 RhinoMocks 模拟方法

RhinoMocks mock method without return

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

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


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

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

在这种情况下,您不需要 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
     });

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

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

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

或者如果 MockedImportImport 的参数相同:

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

当被测方法调用你的假方法并且你想拦截执行时,你应该使用 WhenCalled 方法(执行一些东西 + 更改 return value/change arguments/do 附加步骤等...)。使用 Do 而不是 WhenCalled 的另一个原因是,您的代码变得更具可读性。

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

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