2011-09-24 10 views
7

एक माता पिता के वर्ग Fruit और उसके उपवर्गों Apple और Banana को देखते हुए यह, विधि fooFruit में परिभाषित ठूंठ ताकि Apple और Banana से किसी उदाहरण पर विधि foo के लिए किसी भी कॉल टोंटदार कर रहे हैं हो सकता है?क्या माता-पिता वर्ग में एक विधि को स्टब करना संभव है ताकि सभी सबक्लास उदाहरण rspec में stubbed हैं?

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

अद्यतन की @weexpectedTHIS Rspec 3.6 के लिए जवाब:

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