我有这个例子
FactoryGirl.define do
@site = FactoryGirl.create(:my_site)
factory :user do
email { Faker::Internet.email }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password { 'TarXlrOPfaokNOzls2U8' }
active_directory { '0' }
companies { [FactoryGirl.create(:company, site: @site)] }
sites { [@site] }
end
end
有没有办法用let或者东西实现这个......
FactoryGirl.define do
factory :user do
email { Faker::Internet.email }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password { 'TarXlrOPfaokNOzls2U8' }
active_directory { '0' }
companies { [FactoryGirl.create(:company, site: FactoryGirl.create(:my_site))] }
sites { [FactoryGirl.create(:my_site)] }
end
end
这有效,但是它创建了两个my_site,它是一个Site对象但是我需要它们是相同的......关于如何实现这个的任何想法
答案 0 :(得分:18)
最简单的可能是使用局部变量:
FactoryGirl.define do
site = FactoryGirl.create(:my_site)
factory :user do
email { Faker::Internet.email }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password { 'TarXlrOPfaokNOzls2U8' }
active_directory { '0' }
companies { [FactoryGirl.create(:company, site: site)] }
sites { [site] }
end
end
答案 1 :(得分:2)
我终于想出了一个很好的方法来做到这一点。这个问题很老了,但我想我会发一个答案以防其他人碰到这个问题。
您可以使用before(:create)
回调(或before(:build)
,如果您的用例)来设置sites
集合,然后将网站集的第一个元素分配给新创建的公司在公司集合。
可以找到有关FactoryBot回调的更多信息here。
正如读者所知,我正在使用新的FactoryBot
类名称FactoryGirl
已被弃用。
FactoryBot.define do
factory :user do
email { Faker::Internet.email }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password { 'TarXlrOPfaokNOzls2U8' }
active_directory { '0' }
before(:create) do |user|
user.sites << FactoryBot.create(:my_site)
user.companies << FactoryBot.create(:company, site: user.sites.first)
end
end
end