Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RSpec2:存根由另一个方法调用的方法_Ruby On Rails_Rspec2_Stub - Fatal编程技术网

Ruby on rails RSpec2:存根由另一个方法调用的方法

Ruby on rails RSpec2:存根由另一个方法调用的方法,ruby-on-rails,rspec2,stub,Ruby On Rails,Rspec2,Stub,我对rspec2和rails 3有问题。只有当我直接调用stubbed方法时,才会调用它,而不是由同一类的方法调用它 这是我的模型: 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_pl

我对rspec2和rails 3有问题。只有当我直接调用stubbed方法时,才会调用它,而不是由同一类的方法调用它

这是我的模型:

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
它返回总是真实的结束我从来没有看到日志“真正的选择一个赢家为攻击”

但如果我打电话:

place.attacks(…)
它调用real方法“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)
这里有一个问题,我希望调用stubbed方法。

不,它可以工作:

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

由于您没有显示真实的代码,您确定带有存根的对象与接收
攻击的对象相同吗
方法?我正在为\u攻击选择\u a\u赢家\u内打印“place.object\u id”和“object\u id”,它们是一样的。你能发布你的规范的代码吗?我试着用foo和bar的方法来编写我的代码和一个与你非常相似的规范。如果我从@user0.place获取一个place.new实例,它就会工作,如果我从@user0.place获取它,它就不会工作。。。。我不明白为什么…在工厂里@user0.place是我检查过的地方,它不是零@user0.place是一个has_-one关联。似乎它应该工作。一定是我们看不见的东西。如果您可以发布规范文件和工厂定义,可能会有所帮助。如果这里的代码太多,也许可以作为一个要点。
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