如何解决factory_girl_rails:创建关联的子级时,不会填充工厂构建的模型实例的has_many关联
| 我正在使用factory_girl_rails而不是装置。这是我的模型: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提供了一种身份映射(特殊类型的注册表)来解决此问题(实际上...一个快速的Google似乎表明Rails 3最近将身份映射添加到了源中。我不使用AR,因此不确定如何启用它)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。