2

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

これは私のモデルです:

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

常に true を返します end ログ「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)

ここに問題があります。スタブ化されたメソッドが呼び出されることを期待していました。

4

1 に答える 1

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
于 2011-01-25T03:03:26.407 に答える