很像this question,我也在使用Ryan Bates的nifty_scaffold。它具有使用Mocha的any_instance方法在埋在控制器后面的模型对象中强制“无效”状态的理想方面。
与我链接的问题不同,我没有使用RSpec,而是使用Test :: Unit。这意味着这两个以RSpec为中心的解决方案对我来说无效。
是否有通用(即:使用Test :: Unit)方法来删除any_instance存根?我相信这会导致我的测试中出现错误,我想验证一下。
答案 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)来执行此操作。
但是,在这种情况下可能会有点破坏性。