【问题标题】: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
});