2011-09-24 14 views
7

dado una clase padre Fruit y sus subclases y AppleBanana, es posible el código auxiliar del método definido en fooFruit, de manera que se apagó cualquier llamada a método foo en cualquier caso de Apple y Banana?¿Es posible insertar un método en una clase principal para que todas las instancias de subclase se anulen en 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) no funcionaba y que parece que sólo los talones para las instancias de la fruta. ¿Hay una manera simple de lograr esto que no sea el talón de llamadas para cada subclase?

Encontré este enlace que plantea una pregunta similar pero parece que todavía no se ha respondido. http://groups.google.com/group/mocha-developer/browse_thread/thread/99981af7c86dad5e

Respuesta

9

Esto probablemente no es la solución más limpia, pero funciona:

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

Sí, funciona para este ejemplo sencillo. Pero sería un poco torpe si hay muchas subclases. Tampoco funciona en los modelos de ActiveRecord, porque el método está [anulado en base.rb] (http://stackoverflow.com/questions/1195531/listing-subclasses-doesnt-work-in-ruby-script-console). En realidad estaba buscando una forma de un método para todos los controladores y modelos. – Innerpeacer

+0

Este método funcionó bien para mí, excepto el uso de 'c.constantize.any_instance.stubs (: foo)' – jackbot

0

Si sus subclases tienen subclases, es posible que tenga que atravesar todos ellos de forma recursiva. Hice algo como esto:

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

ACTUALIZACIÓN de @weexpectedTHIS de respuesta para Rspec 3.6:

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