我想做以下事情......
在调用方法之前,某个属性必须始终返回值x 调用方法后,某个属性必须始终返回值y
我熟悉RhinoMocks中的WhenCalled方法,它允许我在调用方法后设置返回值,但我想不出在调用之前设置返回值的方法。到目前为止,我有以下代码......
counter.Expect(n => n.IncreaseCounter())
.WhenCalled(i => counter.Expect(n => n.GetCounter)
.Return(Y).Repeat.Any());
这可能吗?
答案 0 :(得分:4)
有两种方法可以解决这个问题:
使用WhenCalled()
:
var counter = MockRepository.GenerateStub<ICounter>();
int cnt = 1;
counter
.Stub(c => c.GetCounter)
.Return(0)
.WhenCalled(invocation => { invocation.ReturnValue = cnt; });
counter
.Stub(c => c.IncreaseCounter())
.WhenCalled(invocation => { ++cnt; });
使用Do()
处理程序
var counter = MockRepository.GenerateStub<ICounter>();
int cnt = 1;
counter
.Stub(c => c.GetCounter)
.Do((Func<int>)(() => cnt));
counter
.Stub(c => c.IncreaseCounter())
.Do((Action)(() => ++cnt));
这两种情况都是一样的:最初GetCounter
返回1
。每个IncreaseConter()
调用都会增加GetCounter
返回的值。
PS
如果您不打算对counter
进行断言,则可能适合使用Stub()
而不是Expect()
进行设置。参见例如this question了解详情。
答案 1 :(得分:1)
在mocked方法的回调中设置属性的新返回值:
Mock<IFoo> fooMock = new Mock<IFoo>();
fooMock.Setup(foo => foo.Property).Returns(1);
fooMock.Setup(foo => foo.Method())
.Callback(() => fooMock.Setup(x => x.Property).Returns(42));
Mocked属性将返回1
,直到调用mocked方法。然后它的返回值将设置为42
。所有对mocked属性的进一步调用都将返回42
。
答案 2 :(得分:0)
基于亚历山大的解决方案......以下是我正在寻找的......
var counter = MockRepository.GenerateStub<ICounter>();
int x = 1;
int y = 2;
int cnt = x;
counter
.Stub(c => c.GetCounter)
.Return(0)
.WhenCalled(invocation =>
{
invocation.ReturnValue = cnt;
cnt = y;
});