【发布时间】:2011-08-06 02:32:53
【问题描述】:
我在使用 ref 参数存根方法时遇到问题。
我想为某个输入值存根该方法并检查它是否被调用。
我的尝试:
// Variables needed - can be skipped
var activity = MockRepository.GenerateMock<ICompositeActivity<object>>();
var context = new Context<object>(new object());
var inputValue = MockRepository.GenerateMock<IActivity<object>>();
var outputValue = MockRepository.GenerateMock<IActivity<object>>();
var executeCalled = 0;
// The stub:
activity.Stub(
x =>
x.Execute(Arg<Context<object>>.Is.Same(context),
ref Arg<IActivity<object>>.Ref(Is.Same(inputValue), outputValue).Dummy))
.WhenCalled(i => ++executeCalled).Return(true);
var tmp = inputValue;
tmp.ShouldBeTheSameAs(inputValue);
// The execution:
activity.Execute(context, ref tmp);
// The check:
inputValue.ShouldNotBeTheSameAs(outputValue); // Passes, ok
tmp.ShouldBeTheSameAs(outputValue); // Passes, ok
executeCalled.ShouldEqual(1); // Passes, ok
// Passes. Why?
activity.AssertWasCalled(
x =>
x.Execute(Arg<Context<object>>.Is.Same(context),
ref Arg<IActivity<object>>.Ref(Is.Same(outputValue), null).Dummy));
// Doesn't pass. Why?
activity.AssertWasCalled(
x =>
x.Execute(Arg<Context<object>>.Is.Same(context),
ref Arg<IActivity<object>>.Ref(Is.Same(inputValue), outputValue).Dummy));
顺便说一句:我知道,这个测试没有任何意义,因为它不测试任何真正的类。这是我真实测试的浓缩版来说明问题。
如您所见,发生了一些奇怪的事情:
execute方法的stub是正确的,它被调用了,因为executeCalled是1并且tmp参数已经从inputValue变成了outputValue。
但是:
- 第一次检查
AssertWasCalled通过,虽然它检查Execute是否被outputValue调用,但它不是。 - 第二次检查
AssertWasCalled失败,虽然它检查Execute是否被inputValue调用,确实如此。
此外,当我检查存根的WhenCalled 内的i.Arguments[1] 时,它是outputValue,而不是inputValue...看起来Rhino Mocks 正在将输入值更改为指定的返回值,甚至之前调用存根...
这是 Rhino Mocks 中的错误吗?还是我错过了什么?如果是错误,除了executeCalled 计数器之外是否有任何解决方法?
【问题讨论】:
-
投反对票的人能否详细说明一下?
-
我同意丹尼尔..请解释..
标签: c# unit-testing rhino-mocks rhino-mocks-3.5