的方法我在使用ref
參數存根方法時存在問題。
我想爲某個輸入值存根方法,並檢查它是否被調用。
我嘗試:AssertWasCalled和存根引用參數
// 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:我知道,那本次測試沒有任何意義,因爲它不會測試任何真正的類。這是我真實測試的一個精簡版本來說明問題。
正如你所看到的,有什麼奇怪的事情:
execute方法的存根是正確的,它是所謂的,因爲executeCalled
是1和tmp
參數已經從inputValue
改爲outputValue
。
BUT:
- 與
AssertWasCalled
第一檢查通過,儘管它會檢查,Execute
是否被調用outputValue,它不是。 - 第二單向帶
AssertWasCalled
failes,儘管它會檢查,Execute
是否被調用inputValue的,這是。
而且,當我檢查i.Arguments[1]
內存根WhenCalled
,它是outputValue
,不inputValue
......它看起來像犀牛嘲笑被改變輸入值,以指定的返回值,甚至稱存根之前.. 。
這是Rhino Mocks中的一個bug嗎?或者我錯過了什麼?如果它是一個錯誤,是否有任何解決方法,除了executeCalled
計數器?
請問downvoter請詳細說明一下嗎? – 2011-04-15 11:41:00
我同意丹尼爾..解釋.. – 2011-04-15 12:13:58