如何在工厂中保存局部变量

时间:2012-07-06 14:56:43

标签: ruby-on-rails factory-bot

我有这个例子

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对象但是我需要它们是相同的......关于如何实现这个的任何想法

2 个答案:

答案 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