繁体   English   中英

Rhino Mocks - 通过多次调用模拟返回值发生变化(即使传递相同参数时)的方法

[英]Rhino Mocks - mocking a method whose return value changes (even when passed the same parameter) with multiple calls

我正在寻找如何模拟一个在第二次被调用到第一次时返回不同值的方法。 例如,这样的事情:

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。

只需使用

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

这将在第一次调用期间返回1 ,在第二次调用期间返回2 至少在 Rhino Mocks 3.6.0.0 中。

如果时间是该方法返回的决定因素,我会尝试抽象出时间流逝,以便您可以在测试中直接控制它。

类似于名为 ITimeProvider 的接口和名为 GetElapsedTime() 的成员,然后创建一个默认实现以在整个应用程序中使用。

然后,当您进行测试时,传入一个模拟的 ITimeProvider,以便您控制应用程序所感知的时间传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM