2011-09-24 53 views
7

給定一個父類Fruit和它的子類AppleBanana,是有可能存根方法fooFruit定義,這樣就對AppleBanana任何實例方法foo任何調用存根?是否有可能在父類中存根方法,以便所有子類實例在rspec中存根?

class Fruit 
    def foo 
    puts "some magic in Fruit" 
    end 
end 
class Banana < Fruit 
    ... 
end 
class Apple < Fruit 
... 
end 

Fruit.any_instance.stubs(:foo)沒有工作,它看起來像它只是存根水果的實例。有沒有簡單的方法來實現這一點,而不是爲每個子類調用存根?

發現此鏈接引發類似的問題,但它看起來還沒有得到答覆。 http://groups.google.com/group/mocha-developer/browse_thread/thread/99981af7c86dad5e

回答

9

這可能不是最乾淨的解決方案,但它的工作原理:

Fruit.subclasses.each{|c| c.any_instance.stubs(:foo)} 
+0

是,它爲這個簡單的例子。但是如果有許多子類,它會有點笨拙。此外它不適用於ActiveRecord模型,因爲該方法[在base.rb中重寫](http://stackoverflow.com/questions/1195531/listing-subclasses-doesnt-work-in-ruby-script-console)。實際上,我正在尋找一種爲所有控制器和模型存根的方法。 – Innerpeacer

+0

這種方法對我很好,除了使用'c.constantize.any_instance.stubs(:foo)' – jackbot

0

如果你的子類還具有亞,你可能不得不遍歷所有這些遞歸。我做了這樣的事情:

def stub_subclasses(clazz) 
    clazz.any_instance.stubs(:foo).returns(false) 
    clazz.subclasses.each do |c| 
    stub_subclasses(c) 
    end 
end 
stub_subclasses(Fruit) 
0

UPDATE @weexpectedTHIS答案Rspec的3.6:

Fruit.subclasses.each do |klass| 
    allow_any_instance_of(klass).to receive(:foo).and_return(<return_value>) 
end 
相關問題