我在使用参数存根方法时遇到问题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));
BTW:我知道,这个测试没有任何意义,因为它没有测试任何真正的类。这是我真实测试的浓缩版本来说明问题。
如您所见,发生了一些奇怪的事情:
执行方法的存根是正确的,它被调用,因为executeCalled
是 1 并且tmp
参数已从 更改inputValue
为outputValue
。
但:
- 第一次使用
AssertWasCalled
pass进行检查,尽管它检查是否Execute
使用outputValue调用,但不是。 - 第二次检查失败,尽管它检查是否被 inputValue 调用
AssertWasCalled
,它是。Execute
此外,当我检查存根i.Arguments[1]
内部WhenCalled
时,它是outputValue
,不是inputValue
......看起来Rhino Mocks正在将输入值更改为指定的返回值,甚至在调用存根之前......
这是 Rhino Mocks 中的错误吗?还是我错过了什么?如果它是一个错误,在executeCalled
柜台旁边是否有任何解决方法?