2011-01-24 2 views
2

rspec2와 레일스 3에 문제가 있습니다. 스텁 된 메소드는 동일한 클래스의 메소드에 의해 호출 된 것이 아니라 직접 호출하는 경우에만 호출됩니다. RSpec2 : 다른 메소드에 의해 호출 된 메소드를 스터브

내 모델 :

place.stub!(:choose_a_winner_for_attack).and_return(true) 

을 한 후 나는 전화 : 사양에

class Place < ActiveRecord::Base 
    def choose_a_winner_for_attack (p_attack) 
    puts "REAL choose_a_winner_for_attack" 
    (rand() < p_attack) 
    end 

    def attacks(attacked_place, attack_deployments) 
    …. 
    win = choose_a_winner_for_attack(p_attack) 
    …. 
    end 
end 

, 새로운 장소를 만든 후, 나는 그것을 스텁

place.choose_a_winner_for_attack 0 

을 return always always true 나는 "REAL choose_a_winner_for_attack"로그를 보지 못한다.

는하지만 호출하는 경우 :

place.attacks(…) 

는 실제 방법 "choose_a_winner_for_attack을"(I 로그 "REAL choose_a_winner_for_attack"참조)에 문의하십시오.

UPDATE 이 사양의 코드 :

#Stub Place 
    place = @user0.place 
    place.stub!(:choose_a_winner_for_attack).and_return(true) 
    puts "INSIDE SPEC#{f.object_id} #{f.choose_a_winner_for_attack 0}" 
    place.attacks(other_place, deployments) 

가 여기에 문제가있다, 나는 스텁 메소드가 호출 기다리고 있었다.

+0

은 당신이 진짜 코드가 표시되지 않기 때문에, 당신은 스텁 개체의'attacks' 방법을받지 동일한 지 확인하십시오? – nathanvda

+0

choose_a_winner_for_attack 안에 "place.object_id"와 "object_id"가 인쇄되어 있습니다. 동일합니다. – Breezeight

+0

사양에 맞는 코드를 게시 할 수 있습니까? –

답변

1

아니, 그것은 작동 :

class A 
    def foo 
    "foo" 
    end 

    def bar 
    foo 
    end 
end 

describe A do 
    it "stubs methods called from within other methods" do 
    a = A.new 
    a.stub(:foo).and_return("baz") 
    a.foo.should == "baz" # passes 
    a.bar.should == "baz" # passes 
    end 
end 
+0

나는 foo와 bar를 내 코드와 스펙과 비슷하게 만들려고 노력했다. Place.New로 장소 인스턴스를 얻는다면 작동합니다. @ user0.place에서 가져 오면 작동하지 않습니다. ... 이유를 모르겠습니다 ... – Breezeight

+0

'@ user0'은 어떻게 정의되어 있습니까? – zetetic

+0

공장 출하. @ user0.place는 내가 확인한 장소이며 그것은 0이 아닙니다. @ user0.place는 has_one 연관입니다. – Breezeight

관련 문제