2011-09-24 9 views
7

Biorąc pod uwagę klasę nadrzędną Fruit jej podklasy Apple i Banana, możliwe jest skrótową metody foo zdefiniowany w Fruit, tak że wszelkie wywołania metody foo o wszelkich wystąpień Apple i Banana są zgaszone?Czy możliwe jest umieszczenie metody w klasie nadrzędnej, aby wszystkie instancje podklas były zgrupowane w 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) nie działa i wygląda na to tylko odcinki o przypadkach owoców. Czy istnieje prosty sposób osiągnięcia tego innego niż wywoływanie skrótów dla każdej podklasy?

Ten link podniósł podobne pytanie, ale wygląda na to, że nie otrzymał jeszcze odpowiedzi. http://groups.google.com/group/mocha-developer/browse_thread/thread/99981af7c86dad5e

Odpowiedz

9

To prawdopodobnie nie jest najczystszym rozwiązanie, ale działa:

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

Tak, to działa na tym prostym przykładzie. Byłoby jednak trochę niezgrabne, gdyby było wiele podklas. Nie działa również w modelach ActiveRecord, ponieważ metoda jest [przesłonięta w base.rb] (http://stackoverflow.com/questions/1195531/listing-subclasses-doesnt-work-in-ruby-script-console). Właściwie szukałem sposobu na pobranie metody dla wszystkich kontrolerów i modeli. – Innerpeacer

+0

Ta metoda działa dobrze dla mnie, z wyjątkiem użycia 'c.constantize.any_instance.stubs (: foo)' – jackbot

0

Jeśli podklasy mieć podklasy, być może trzeba przemierzać je wszystkie rekurencyjnie. Zrobiłem coś takiego:

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 z @weexpectedTHIS odpowiedź dla rspec 3.6:

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