Is there a way to undo Mocha stubbing of any_instance in Test::Unit

时光总嘲笑我的痴心妄想 提交于 2019-12-21 06:49:27

问题


Much like this question, I too am using Ryan Bates's nifty_scaffold. It has the desirable aspect of using Mocha's any_instance method to force an "invalid" state in model objects buried behind the controller.

Unlike the question I linked to, I'm not using RSpec, but Test::Unit. That means that the two RSpec-centric solutions there won't work for me.

Is there a general (ie: works with Test::Unit) way to remove the any_instance stubbing? I believe that it's causing a bug in my tests, and I'd like to verify that.


回答1:


As it happens, Mocha 0.10.0 allows 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!"



回答2:


Mocha does not provide such a functionality. However you can implement it yourself.

The first thing we should know about mocha is that mocha actually replaces the original methods when you stub them. So in order to be able to restore these methods later, you must keep a reference to the former ones. It can be easily achieved by: alias new_method old_method. It must be done before mocking the old_method.

Now, to unmock a method, you only need to alias old_method new_method.

Consider the following code:

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



回答3:


If you want to remove all your stubs/expectations in one go, then you can do that using mocha_teardown (eg. call self.mocha_teardown).

May be a little bit destructive in this case, however.



来源:https://stackoverflow.com/questions/2894331/is-there-a-way-to-undo-mocha-stubbing-of-any-instance-in-testunit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!