有没有办法在Test :: Unit中撤消任何实例的Mocha存根

时间:2010-05-24 01:37:58

标签: ruby mocking testing stub mocha

很像this question,我也在使用Ryan Bates的nifty_scaffold。它具有使用Mocha的any_instance方法在埋在控制器后面的模型对象中强制“无效”状态的理想方面。

与我链接的问题不同,我没有使用RSpec,而是使用Test :: Unit。这意味着这两个以RSpec为中心的解决方案对我来说无效。

是否有通用(即:使用Test :: Unit)方法来删除any_instance存根?我相信这会导致我的测试中出现错误,我想验证一下。

3 个答案:

答案 0 :(得分:37)

碰巧,Mocha 0.10.0允许unstubbing on any_instance()

str = "Not Stubbed!"
String.any_instance.stubs(:to_s).returns("Stubbed!")
puts str.to_s   # "Stubbed!"
String.any_instance.unstub(:to_s)
puts str.to_s   # "Not Stubbed!"

答案 1 :(得分:4)

Mocha不提供此类功能。但是你可以自己实现它。

关于mocha我们应该知道的第一件事是mocha实际上替换了原始方法。因此,为了以后能够恢复这些方法,您必须保留对前者的引用。它可以通过以下方式轻松实现:alias new_method old_method。 必须在 模拟old_method之前完成。

现在,要取消模拟方法,您只需要alias old_method new_method

请考虑以下代码:

class A
    def a
        true
    end
end


class TestA < Test::Unit::TestCase
    def test_undo_mock
        a = A.new
        A.class_eval {alias unmocked_a a}

        A.any_instance.stubs(:a).returns("b")
        assert a.a, "b"

        A.class_eval {alias a unmocked_a}
        assert a.a, "a"
    end
end

答案 2 :(得分:0)

如果您想一次删除所有存根/期望,那么您可以使用mocha_teardown(例如,调用self.mocha_teardown)来执行此操作。

但是,

在这种情况下可能会有点破坏性。