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

标签 c# unit-testing mocking rhino-mocks

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

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/

相关文章:

c# - 更改目标构建时 Visual Studio 2017 dotnet 崩溃

c# - 在.Net中使用Linq解析没有根元素的xml元素

java - 服务类方法的代码覆盖率

go - 是否可以断言通过像 Java Mockito 一样在 Go 中进行 spy 事件来调用真正的方法?

c# - 在 RhinoMocks 中使用回调触发器

c# - asp.net mvc 应用程序中的时间跨度

c# - 如何使用Container获取绑定(bind)数据?

unit-testing - 强制对开发人员进行单元测试

unit-testing - 如何为测试目的重新定义/模拟 Go 中的方法?

java - Mockito 调用监听器确定源