Можно ли заглушить метод в родительском классе, чтобы все экземпляры подкласса были заглушены в rspec? - PullRequest
7 голосов
/ 24 сентября 2011

Учитывая родительский класс Fruit и его подклассы Apple и Banana, возможно ли заглушить метод foo, определенный в Fruit, так что любые вызовы метода foo в любых случаяхApple и Banana заглушки?

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

Fruit.any_instance.stubs(:foo) не сработало и похоже, что это только заглушки для экземпляров Fruit.Есть ли простой способ добиться этого, кроме вызова заглушек для каждого подкласса?

Нашел эту ссылку, подняв похожий вопрос, но, похоже, на него еще не ответили.http://groups.google.com/group/mocha-developer/browse_thread/thread/99981af7c86dad5e

Ответы [ 3 ]

9 голосов
/ 25 сентября 2011

Возможно, это не самое чистое решение, но оно работает:

Fruit.subclasses.each{|c| c.any_instance.stubs(:foo)}
0 голосов
/ 23 июня 2017

ОБНОВЛЕНИЕ из @ мы ожидали ЭТОГО ответ для Rspec 3.6:

 Fruit.subclasses.each do |klass|
    allow_any_instance_of(klass).to receive(:foo).and_return(<return_value>)
 end
0 голосов
/ 02 мая 2014

Если у ваших подклассов есть подклассы, вам, возможно, придется пройти их все рекурсивно.Я сделал что-то вроде этого:

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