RhinoMocks - 模拟一个方法,其返回值随多次调用而改变(即使传递相同的参数)

Ale*_*exC 21 c# unit-testing rhino-mocks mocking

我想找出如何模拟一个方法,它在第二次调用它时第二次返回一个不同的值.例如,像这样:

public interface IApplicationLifetime
{
    int SecondsSinceStarted {get;}
}

[Test]
public void Expected_mock_behaviour()
{
    IApplicationLifetime mock = MockRepository.GenerateMock<IApplicationLifetime>();

    mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
    mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();

    Assert.AreEqual(1, mock.SecondsSinceStarted);
    Assert.AreEqual(2, mock.SecondsSinceStarted);
}
Run Code Online (Sandbox Code Playgroud)

有什么能使这成为可能吗?除了为实现状态机的getter实现一个sub?

干杯fellas,

亚历克斯

k.m*_*k.m 35

您可以使用.WhenCalled方法拦截返回值.请注意,您仍然需要通过.Return方法提供值,但是如果ReturnValue从方法调用更改,Rhino将忽略它:

int invocationsCounter = 1;
const int IgnoredReturnValue = 10;
mock.Expect(m => m.SecondsSinceLifetime)
    .WhenCalled(mi => mi.ReturnValue = invocationsCounter++)
    .Return(IgnoredReturnValue);

Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(1));
Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(2));
Run Code Online (Sandbox Code Playgroud)

编辑:

周围挖一点多,似乎.Repeat.Once() 确实在这种情况下工作,可以用来实现相同的结果:

mock.Expect(m => m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m => m.SecondsSinceStarted).Return(2).Repeat.Once();
mock.Expect(m => m.SecondsSinceStarted).Return(3).Repeat.Once();
Run Code Online (Sandbox Code Playgroud)

连续呼叫将返回1,2,3.


Ser*_*kiy 6

简单地使用

mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();
Run Code Online (Sandbox Code Playgroud)

这将1在第一次通话2期间和第二次通话期间返回.至少在RhinoMocks 3.6.0.0上