Ruby on Rails - factory_girl_rails:创建关联子实例时未填充工厂构建的模型实例的has_many关联



我使用factory_girl_rail而不是fixture。以下是我的型号:

class User < ActiveRecord::Base
  has_many :tasks
  belongs_to :project
end
class Task < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end
class Project < ActiveRecord::Base
  has_many :users
  has_many :tasks
end

这是相关的工厂:

Factory.define :task do |t|
  t.association :user
  t.association :project
  t.after_create {|t| t.user.tasks << t}
  t.after_create {|t| t.project.tasks << t}
end

在集成测试中,我这样做:

scenario "user with tasks from one project is assigned another task from the same project" do
  user = Factory.create :user
  (1..5).each { Factory.create(:task, :user => user, :project => user.project)}
  visit_project_path user.project
  correctly_fill_in_new_task_fields
  click_button "Create task" #creates a new task for the above user
  assert user.tasks.size == 6 #currently fails
end

我遇到的问题是,在场景运行user.tasks.size == 5之后,却运行Task.where(:user_id => user.id).size == 6。如果有任何帮助,我将不胜感激。

实际上,这更可能是由于ActiveRecord的工作方式。控制器从数据库中获取用户,并创建一个新的user实例。现在,您的控制器和测试引用了两个不同的用户,这就是为什么您的测试从未看到更改的原因。

在再次检查有多少任务之前,您需要在user上调用reload

附带说明:一些ORM提供了一个身份映射(特殊类型的注册表)来解决这个问题(实际上……谷歌似乎很快表明Rails3最近在源代码中添加了一个标识映射。我不使用AR,所以不确定如何启用它)。

最新更新