RSpec2: заглушить метод, вызванный другим методом - PullRequest
2 голосов
/ 24 января 2011

У меня проблема с 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

всегда возвращается истинный конецЯ никогда не вижу журнал "REAL choose_a_winner_for_attack".

Но если я вызываю:

place.attacks(…)

, он вызывает реальный метод "choose_a_winner_for_attack" (я вижу журнал "REAL choose_a_winner_for_attack").

ОБНОВЛЕНИЕ Этот код спецификации:

  #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)

Здесь есть проблема, я ожидал, что вызван метод с заглушкой.

1 Ответ

1 голос
/ 25 января 2011

Нет, все работает:

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
...