是否可以在父类中存根方法,以便所有子类实例都在rspec中存根?

时间:2011-09-24 13:20:16

标签: ruby-on-rails ruby rspec mocha

鉴于父类Fruit及其子类AppleBanana,是否可以存根foo中定义的方法Fruit,以便任何在fooApple的任何实例上调用方法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 个答案:

答案 0 :(得分:9)

这可能不是最干净的解决方案,但它有效:

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

答案 1 :(得分: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)

答案 2 :(得分:0)

Rspec 3.6的 @weexpectedTHIS 答案的

更新

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