31

就像这个问题一样,我也在使用 Ryan Bates 的 nifty_scaffold。它具有使用 Mocha 的any_instance方法来强制隐藏在控制器后面的模型对象中的“无效”状态的理想方面。

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

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

4

3 回答 3

49

碰巧的是,Mocha 0.10.0 允许在 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!"
于 2011-12-21T19:29:36.523 回答
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
于 2010-05-24T12:17:33.920 回答
0

如果您想一次性删除所有存根/期望,那么您可以使用 mocha_teardown 来实现(例如,调用 self.mocha_teardown)。

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

于 2016-01-11T09:11:44.577 回答