2

在 RSpec Testing for Zombies 中,我试图让这个测试通过

describe Zombie do
  it "starts off with two weapons" do
    z = Zombie.new(:name => "Ash")
    z.weapons.count.should == 2
  end
end

为此,我使用了 after_initialize 模型回调来创建(“构建”)武器

class Zombie < ActiveRecord::Base
  after_initialize :grant_two_weapons

  def grant_two_weapons
     self.weapons.build(:name => "axe")
     self.weapons.build(:name => "stick")
  end
end

现在测试没有通过,但还有一个问题,即标题中的问题。所以在 Rails 控制台中……</p>

z = Zombie.new
z.weapons
#=> [#<Weapon id: nil, name: "axe", zombie_id: nil, created_at: nil, updated_at: nil>, #<Weapon id: nil, name: "stick", zombie_id: nil, created_at: nil, updated_at: nil>] 

看起来我们得到了测试中描述的我们想要的东西,但是当我这样做时:

z.weapons.count
#=> 0

因此测试失败。这个包含 2 个实体的数组如何计数为 0?这是一个围绕“构建”等的轨道问题,但它也是一个红宝石问题。该数组中有两个实体,但 ruby​​ 似乎在“撒谎”

4

2 回答 2

2

这就是工作方式count,它在数据库中执行 SQL 计数,但您的记录尚未保存,因此它为零。

z.weapons.size或者z.weapons.length会给你你所期望的。

例如:http ://rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length

于 2013-03-02T17:58:10.460 回答
0

根据这篇文章,有一些文档说明如果按照您的定义定义 after_initialize 将被忽略。

但是,发布者似乎观察到与该文档冲突的行为,因此 YMMV。(这可能取决于您使用的 Rails 版本,但这是推测。)

我希望我能给出一个更明确的答案,但希望这可以成为更熟悉 after_initialize 行为的人的跳板。

于 2013-03-02T18:06:00.183 回答