2010-05-24 81 views
17

中取消any_instance的Mocha stubbing,就像this question一樣,我也在使用Ryan Bates的nifty_scaffold。它具有使用Mocha的any_instance方法強制隱藏在控制器後面的模型對象中的「無效」狀態的理想方面。有沒有辦法在Test :: Unit

與我鏈接到的問題不同,我沒有使用RSpec,而是使用Test :: Unit。這意味着這兩種以RSpec爲中心的解決方案不適合我。

是否有一般(即:與Test :: Unit一起工作)的方式來刪除any_instance存根?我相信它在我的測試中造成了一個錯誤,我想驗證一下。

回答

31

碰巧,摩卡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!" 
4

摩卡沒有提供這樣的功能。但是你可以自己實現它。

我們應該知道的關於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 
+0

非常好。這看起來像是可以添加/ monkeypatched到摩卡的東西。 – 2010-05-24 16:05:36

+0

我從來沒有覺得需要這個功能,但是如果你想遊說一張票 - http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/69-allow-unstubbing-of-methods爲改變。如果你有一些你爲什麼想要使用它的例子,那將是非常好的。 – 2010-09-26 16:51:02

+0

我已添加未分類功能 - 摩卡::對象方法#未讀 - 請參閱http://mocha.rubyforge.org/classes/Mocha/ObjectMethods.html#M000009 – 2010-12-02 11:08:19

0

如果你想刪除一個全力以赴的存根/預期,那麼你可以做,使用mocha_teardown(如呼叫self.mocha_teardown)。

然而,在這種情況下可能會有點破壞性。