ace*_*reg 11 testing ruby-on-rails ruby-on-rails-3 factory-bot
以下是FactoryGirl 文档中的示例:
FactoryGirl.define do
factory :post do
name "Post name"
user
end
end
Run Code Online (Sandbox Code Playgroud)
在此示例中,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
Run Code Online (Sandbox Code Playgroud)
我试图整合讨论别名的文档部分,但没有运气:
FactoryGirl.define do
factory :user, :aliases => [:assignee] do
....
Run Code Online (Sandbox Code Playgroud)
我觉得(希望?)我在这附近,但任何见解都值得赞赏.谢谢.
编辑:此代码运行我的规格!
**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
Run Code Online (Sandbox Code Playgroud)
它通过我的it { should be_valid }规范,所以看起来工厂很好,虽然我认为我在调用时在规范本身有一些重构FactoryGirl.create.
上面的代码包含了mguymon的建议.谢谢!
最终更新
回过头来重新阅读Hartl关于模型关联的讨论之后,我能够让这件事情得以休息.我上面的内容是技术上有效的,但是当我在我的规范中构建或创建作业时,实际上没有正确地传递属性.这就是我应该拥有的:
FactoryGirl.define do
factory :job do
association :assignee, factory: :user
user
end
end
Run Code Online (Sandbox Code Playgroud)
我的问题也源于我在我的规范中创建工厂的方式,所以我应该这样做(但不是......叹气):
let(:user) { create(:user) }
before { @job = create(:job, user: @user) }
Run Code Online (Sandbox Code Playgroud)
似乎我没有明确地必须association :user在我的工厂,我也不需要before从上面的块.
顺便说一句,我还了解到我可以通过包含puts @job在expect语句中来调试,或者调用@job.assignee_id以确保正确加载属性.运行该特定规范时,puts语句将通过规范F或.从规范输出.
mgu*_*mon 17
对于FactoryGirl的最新版本,用于association映射到其他ActiveRecord模型:
factory :job do
# ...
association :assignee, factory: :user
end
Run Code Online (Sandbox Code Playgroud)
这直接来自文档.
从您发布的错误中,它表明您正在尝试获取user.id但user不是ActiveRecord实例,而是来自FactoryGirl的代理.如果您使用该association方法,则不会出现此错误.如果需要直接访问模型,则必须先手动构建它.您可以通过在工厂中传递块来执行此操作:
factory :job do
assignee_id { FactoryGirl.create(:user).id }
end
Run Code Online (Sandbox Code Playgroud)
看起来您尝试将相同的模型关联两次,为此您可以使用before_create回调来创建用户模型并分配给user和assignee:
factory :job do
before(:create) do |job|
user = FactoryGirl.create(:user)
job.assignee = user
job.user = user
end
end
Run Code Online (Sandbox Code Playgroud)