我正在寻找如何模拟一个在第二次调用时返回不同值的方法。例如,像这样:
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);
}
有什么可以让这成为可能吗?除了为实现状态机的 getter 实现 sub 之外?
最佳答案
您可以使用 .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));
再深入一点,似乎 .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();
将在连续调用时返回 1、2、3。
关于c# - Rhino Mocks - 通过多次调用模拟其返回值发生变化(即使传递相同参数)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720908/