2011-01-24 18 views
2

私はrspec2とレール3に問題があります。スタブされたメソッドは、同じクラスのメソッドによって呼び出された場合ではなく、直接呼び出す場合にのみ呼び出されます。RSpec2:別のメソッドで呼び出されたメソッドをスタブします

これは私のモデルである:新しい場所を作成した後、私はそれをスタブ、スペックで

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.stub!(:choose_a_winner_for_attack).and_return(true) 

をし、私が呼ぶ:

place.choose_a_winner_for_attack 0 

それ私はログ "REAL choose_a_winner_for_attack"を見ることはありません。

しかし、私は呼び出す場合:

place.attacks(…) 

それが本当の方法 "choose_a_winner_for_attack"(私はログ "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は私がチェックした場所であり、ゼロではありません。 @ user0.placeはhas_oneの関連付けです。 – Breezeight

関連する問題