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

Mat*_*iby 9 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
Run Code Online (Sandbox Code Playgroud)

有没有办法用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
Run Code Online (Sandbox Code Playgroud)

这有效,但它创建了两个my_site,这是一个Site对象,但我需要它们是相同的...任何想法如何实现这一点

tok*_*and 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
Run Code Online (Sandbox Code Playgroud)

  • 这样做的问题是它只创建一次“site”变量。如果我想在每次工厂机器人运行时创建一个变量(例如“my_rand_number = Random.rand(1..10)”),我只会得到一个随机数,并且每次创建新模型实例时都会得到相同的数字。您知道如何使用每个“FactoryBot.create(:my_site)”语句获取不同的随机数吗? (3认同)

RSm*_*lal 6

我终于找到了一个好方法来做到这一点。这个问题很老了,但我想我会发布一个答案,以防其他人遇到这个问题。

您可以使用before(:create)回调(或者before(:build)如果这是您的用例)来设置sites集合,然后将网站集的第一个元素分配给公司集合中新创建的公司。

有关 FactoryBot 回调的更多信息可以在此处找到。

让读者知道,我正在使用已弃用的新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
Run Code Online (Sandbox Code Playgroud)