【问题标题】:How to change behaviour of stubs?如何改变存根的行为?
【发布时间】:2010-10-12 09:59:57
【问题描述】:

我可以在运行时更改存根的行为吗?比如:

    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"

或者还有其他技巧可以对行为随时间变化的存根进行建模吗?我宁愿不使用fi.Stub(...).Do(...)

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

【问题讨论】:

  • 试试fi.Stub(x =&gt; x.GetBar()).Return("A").Repeat.Once();fi.Stub(x =&gt; x.GetBar()).Return("B").Repeat.Once();

标签: c# unit-testing rhino-mocks


【解决方案1】:

警告

改变存根的行为是一种代码味道!

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

退房:

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

所以,请:只有在无法避免时才使用此解决方案。在我看来,这篇文章几乎是一个糟糕的建议——但是在极少数情况下你真的需要它。


啊,我自己想通了。 Rhino 支持录制/回放模式。虽然 AAA 语法始终将对象保持在重放模式,但我们可以切换到记录并返回重放,以清除存根的行为。

不过看起来有点老套……

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

【讨论】:

  • 如果您想使用 Rhino Mocks 原生的术语,请将其设为 ClearExpectations
  • @Richard:.Stub 添加的行为没有设定预期。您正在考虑使用.Expect 添加的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2021-01-30
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多