2011-09-24 3 views
7

는 부모 클래스 Fruit와 그 서브 클래스 AppleBanana을 감안할 때, 그것은 AppleBanana의 인스턴스에 대한 방법 foo에 대한 호출이 스텁되도록, 방법 fooFruit에 정의 된 스텁 수 있습니까?부모 클래스의 메소드를 스텁하여 모든 서브 클래스 인스턴스가 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) 작동하지 않았다 그것은 과일의 인스턴스를 위해 같은 단지 스텁을 보인다. 모든 하위 클래스에 대해 스텁을 호출하는 것 이외의 다른 방법을 구현할 수있는 간단한 방법이 있습니까?

이 링크는 비슷한 질문을 제기했지만 아직 답을 찾지 못했습니다. http://groups.google.com/group/mocha-developer/browse_thread/thread/99981af7c86dad5e

답변

9

이것은 아마도 가장 깨끗한 해결책은 아니지만 작동 : 당신의 서브 클래스는 서브 클래스가있는 경우

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

네,이 간단한 예를 들어 작동이 같은 일을했다. 그러나 많은 하위 클래스가 있다면 그것은 약간 어색 할 것입니다. 또한 메서드가 [base.rb에서 재정의] (http://stackoverflow.com/questions/1195531/listing-subclasses-doesnt-work-in-ruby-script-console)이기 때문에 ActiveRecord 모델에서는 작동하지 않습니다. 실제로 모든 컨트롤러와 모델을위한 메서드를 스텁 (stub)하는 방법을 찾고있었습니다. – 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

UPDATE의 @weexpectedTHIS RSpec에 3.6 답 :

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