【问题标题】:Is there a way to undo Mocha stubbing of any_instance in Test::Unit有没有办法撤消 Test::Unit 中 any_instance 的 Mocha 存根
【发布时间】:2010-05-24 01:37:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby testing mocking stub ruby-mocha


    【解决方案1】:

    碰巧的是,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!"
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多