RhinoMocks模拟方法没有返回

时间:2015-06-15 12:29:47

标签: c# unit-testing rhino-mocks

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

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


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

ITempDa.Import应该被嘲笑,而是一些内部方法&#34; MockedImport&#34;应该叫。

2 个答案:

答案 0 :(得分: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()));

MockedImportImport相同的参数:

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()));

答案 1 :(得分:0)

在这种情况下,您不需要Return()调用,因为该方法返回void。如果要拦截调用并对模拟操作执行某些逻辑,请使用WhenCalled。在这种情况下,它也只是忽略Stub中的参数并处理WhenCalled表达式中的所有内容。 e.g。

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