c# - 使用 Rhino Mocks,BackToRecord() 是否也应该清除方法被调用次数的计数?

标签 c# rhino-mocks

从关于 SO 的许多其他问题中可以看出,为了重置对模拟对象进行方法调用的次数计数,您可以调用 BackToRecord(),然后调用 Replay()。

但是这对我不起作用。它会重置 stub 值,但不会重置方法调用计数。

因此从相关问题扩展一个示例...

public interface IFoo { string GetBar(); }
    [TestMethod]
    public void TestRhino()
    {
        var fi = MockRepository.GenerateStub<IFoo>();
        fi.Stub(x => x.GetBar()).Return("A");
        Assert.AreEqual("A", fi.GetBar());
        fi.AssertWasCalled(x=>x.GetBar(), x=>x.Repeat.Once());

        // Switch to record to clear behaviour and then back to replay
        fi.BackToRecord(BackToRecordOptions.All);
        fi.Replay();

        fi.Stub(x => x.GetBar()).Return("B");
        Assert.AreEqual("B", fi.GetBar());
        fi.AssertWasCalled(x => x.GetBar(), x => x.Repeat.Once());
    }

这在最后一行以“预期#1,实际#2”失败。

我是不是漏掉了重点,还是它根本不适用于方法计数?有没有办法在不创建新模拟的情况下实现这一目标?

由于我不会深入的原因,我无法在调用 GetBar() 之前设置期望值。

最佳答案

嗯,不是这样的;这是一个不寻常的用例。

这是一种选择:

[TestMethod]
public void TestRhino()
{

    var getBarCount = 0;

    var fi = MockRepository.GenerateStub<IFoo>();
    fi.Stub(x => x.GetBar()).Return("A").WhenCalled(x => getBarCount++);
    Assert.AreEqual("A", fi.GetBar());
    Assert.AreEqual(1, getBarCount);

    // Switch to record to clear behaviour and then back to replay
    fi.BackToRecord(BackToRecordOptions.All);
    fi.Replay();
    getBarCount = 0;

    fi.Stub(x => x.GetBar()).Return("B").WhenCalled(x => getBarCount++);
    Assert.AreEqual("B", fi.GetBar());
    Assert.AreEqual(1, getBarCount);
}

关于c# - 使用 Rhino Mocks,BackToRecord() 是否也应该清除方法被调用次数的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8049943/

相关文章:

c# - 使用具有 ref 参数的方法的 AssertWasCalled 和 Stub

c# - 从字符串反序列化时使用 XmlSerializer.CanDeserialize()

c# - 如何模拟 WCF 服务?

c# - 模拟验证交互

c# - 为什么 IsEnabled 是 ILogger 接口(interface)的一部分?

c# - 单元测试自定义 ConfigurationElement 和 ConfigurationElementCollection

unit-testing - 如何为使用 RenderPartialViewToString 返回 JsonResult 的方法编写单元测试?

c# - 如果在 "using"语句中使用try/catch,一次性资源会被释放吗?

c# - 通过属性以外的方式将模型和订阅 key 传递给 LuisDialog

c# - ASP.NET Core 2.0 Razor Pages 使用 AddMvcCore() 而不是 AddMvc()