当前位置:  开发笔记 > 编程语言 > 正文

如何改变存根的行为?

如何解决《如何改变存根的行为?》经验,为你挑选了1个好方法。

我可以在运行时更改存根的行为吗?就像是:

    public interface IFoo { string GetBar(); }
    [TestMethod]
    public void TestRhino()
    {
        var fi = MockRepository.GenerateStub();
        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(...).

啊,可能我只是需要硬拷贝的精美手册让某人用它来击打我.它看起来应该很明显,但我找不到它.



1> froh42..:

警告

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

它通常表明您的单元测试过于复杂,难以理解且易碎,很容易在正在测试的类中进行正确的更改.

查看:

[xUnit测试模式] [1]

[单元测试的艺术] [2]

所以,请:只有在你无法避免的情况下才使用这个解决方案.在我看来,这篇文章接近于糟糕的建议 - 但是在极少数情况下你确实需要它.


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

它看起来有些神圣,但......

    public interface IFoo { string GetBar(); }
    [TestMethod]
    public void TestRhino()
    {
        var fi = MockRepository.GenerateStub();
        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(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();
    }
}

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有