c# - 如何改变 stub 的行为?

标签 c# unit-testing rhino-mocks

我可以在运行时更改 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.Stub(x => x.GetBar()).Return("B");
        Assert.AreEqual("B", fi.GetBar());    // Currently fails here
    }

我的代码示例在给定行中仍然失败,fi.GetBar() 仍然返回 "A"

或者是否有另一种技巧可以对行为随时间变化的 stub 进行建模?我宁愿不使用 fi.Stub(...).Do(...)

啊,可能我只需要精美手册的硬拷贝,以便有人用它敲打我的脑袋。看起来应该很明显,但我找不到。

最佳答案

警告

更改 stub 的行为是一种代码味道!

这通常表明您的单元测试过于复杂、难以理解且脆弱,很容易在被测类的正确更改上崩溃。

查看:

  • [xUnit 测试模式][1]
  • [单元测试的艺术][2]

因此,请:仅在无法避免时才使用此解决方案。在我看来,这篇文章近乎糟糕的建议 - 但是在极少数情况下您确实需要它。


啊,我自己想通了。 Rhino 支持录制/回放模式。虽然 AAA 语法始终将对象保持在重播模式,但我们可以切换到记录并返回重播以清除 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());

        // 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());
    }

更新:

我以后会用到它,这样看起来会好一点:

internal static class MockExtension {
    public static void ClearBehavior<T>(this T fi)
    {
        // Switch back to record and then to replay - that 
        // clears all behaviour and we can program new behavior.
        // Record/Replay do not occur otherwise in our tests, that another method of
        // using Rhino Mocks.

        fi.BackToRecord(BackToRecordOptions.All);
        fi.Replay();
    }
}

关于c# - 如何改变 stub 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/630037/

相关文章:

c# - 查找 .Intersect .Count > 阈值情况的快捷方式?

javascript - 如何清除每次测试之间的 Jest 状态( spy 、模拟)?

c# - 模拟和 HttpContextBase.get_User()

java - 为 Presenter 类编写 Mockito 测试(Presenter First 模式)

c# - 在 RhinoMocks 中模拟 void 函数的正确方法是什么?

c# - Moq 可以模拟 HubConnection 但 RhinoMocks 不能?

c# - 当仅知道所需对象的字符串名称时,C# 中的 JsonConvert.DeserializeObject

c# - Asp.net 如何限制文本框按键事件中小数点前后的位数

c# - Crystalreportviewer 不渲染(asp.net mvc4 razor 语法)

angularjs - 如何使用 karma 和 mocha+chai 单元测试 angularjs 路由的解析?