【发布时间】:2013-04-14 13:35:31
【问题描述】:
这是来自 FactoryGirl documentation 的示例:
FactoryGirl.define do
factory :post do
name "Post name"
user
end
end
在此示例中,user 正在调用另一个工厂。我想做的是有效地调用user.id,但将其设置为属性的定义。这是一个精简的示例:
**models/job.rb**
...
belongs_to :assignee, :class_name => "User"
belongs_to :user
...
attr_accessible :assignee_id, :user_id
...
end
**factories/jobs.rb**
FactoryGirl.define do
factory :job do
assignee_id user.id #what I would like to do, but triggers "undefined method 'id'" error
user_id user.id #user_id is an attribute of the model and is the job assignor
end
我已尝试合并文档中讨论别名的部分,但没有成功:
FactoryGirl.define do
factory :user, :aliases => [:assignee] do
....
我觉得(希望?)我在这里很近,但任何见解都值得赞赏。谢谢。
编辑:这段代码让我的规范运行!
**factories/jobs.rb**
FactoryGirl.define do
factory :job do
before(:create) do |job|
user = FactoryGirl.create(:user)
job.assignee = user
job.user = user
end
association :assignee, factory: :user
association :user, factory: :user
sequence(:user_id) { |n| n }
sequence(:assignee_id) { |n| n }
...
end
它通过了我的 it { should be_valid } 规范,所以看起来工厂很好,尽管我认为当我调用 FactoryGirl.create 时我对规范本身进行了一些重构。
上面的代码结合了 mguymon 的建议。谢谢!
最终更新
在回去重读Hartl's discussion on model associations之后,我才得以平息这件事。我上面的内容在技术上是有效的,但是当我在我的规范中构建或创建工作时,实际上并没有正确传递属性。这是我应该拥有的:
FactoryGirl.define do
factory :job do
association :assignee, factory: :user
user
end
end
我的问题还源于我是如何在规范中创建工厂的,所以我应该这样做(但不是...叹息):
let(:user) { create(:user) }
before { @job = create(:job, user: @user) }
我的工厂似乎不需要明确地有association :user,也不需要上面的before 块。
顺便说一句,我还了解到我可以通过在expect 语句中包含puts @job 进行调试,或者调用@job.assignee_id 以确保属性被正确加载。当运行该特定规范时,puts 语句将在规范中的 F 或 . 旁边输出。
【问题讨论】:
-
抱歉,您能显示异常堆栈跟踪吗?谢谢
标签: ruby-on-rails ruby-on-rails-3 testing factory-bot