就像这个问题一样,我也在使用 Ryan Bates 的 nifty_scaffold。它具有使用 Mocha 的any_instance方法来强制隐藏在控制器后面的模型对象中的“无效”状态的理想方面。
与我链接的问题不同,我没有使用 RSpec,而是使用 Test::Unit。这意味着那里的两个以 RSpec 为中心的解决方案对我不起作用。
是否有一种通用的(即:与 Test::Unit 一起使用)方法来删除 any_instance 存根?我相信它会导致我的测试出现错误,我想验证一下。
就像这个问题一样,我也在使用 Ryan Bates 的 nifty_scaffold。它具有使用 Mocha 的any_instance方法来强制隐藏在控制器后面的模型对象中的“无效”状态的理想方面。
与我链接的问题不同,我没有使用 RSpec,而是使用 Test::Unit。这意味着那里的两个以 RSpec 为中心的解决方案对我不起作用。
是否有一种通用的(即:与 Test::Unit 一起使用)方法来删除 any_instance 存根?我相信它会导致我的测试出现错误,我想验证一下。
碰巧的是,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!"
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
如果您想一次性删除所有存根/期望,那么您可以使用 mocha_teardown 来实现(例如,调用 self.mocha_teardown)。
然而,在这种情况下可能会有点破坏性。