同一工厂的多个版本(FactoryGirl)

时间:2014-03-31 12:50:48

标签: ruby-on-rails factory-bot

有没有办法让同一工厂有多个版本?例如,user工厂。

FactoryGirl.define do
  factory :user#1 do
    name 'John Doe'
    date_of_birth { 21.years.ago }
  end

  factory :user#2 do
    name 'Jane Doe'
    date_of_birth { 25.years.ago }
  end
end

是否有这样的内容,以便我可以为John致电FactoryGirl.create :user#1或为Jane致FactoryGirl.create :user#2

user工厂是我实际上没有使用的一个例子,但我的真正工厂正在使用大量数据。我发现每次需要其他用户时手动更改大量数据都很麻烦。

3 个答案:

答案 0 :(得分:2)

您不必申报两次

按照

FactoryGirl.define do
  factory :user do
    name
    date_of_bith
  end
end

现在动态地你可以打电话

user1 = FactoryGirl.create(:user, name: 'John doe', date_of_birth: 21.year.ago)
user2 = FactoryGirl.create(:user, name: 'Jane doe', date_of_birth: 25.year.ago) 

答案 1 :(得分:0)

与提供调用中的所有数据相反,我只是通过使用序列为我提供独特的数据来使我的工厂动态化。

FactoryGirl.define do
  factory :mail_user do
    mail_domain
    account
    sequence :userid do |n|
        "mailuser-#{n}"
    end
    passwd "This!sADecentPassword11212"
    active :true
    filter :false
  end
end

或使用traits / inheritance为我提供我需要的确切用户数据

FactoryGirl.define do
  factory :administrator do
    isp
    sequence :email do |n|
      "user#{n}@example.com"
    end
    active true
    name "Random Awesome Admin"
    password '123Abc#$1'
    password_confirmation '123Abc#$1'

    trait :inactive do
      active false
    end

    trait :system do
      roles [:system_admin]
    end

    trait :admin do
      roles [:admin ]
    end

    trait :realm do
      roles [:realm_admin]
    end

    trait :helpdesk do
      roles [ :helpdesk ]
    end

    trait :dns do
      roles [ :dns_admin ]
    end

    factory :inactive_administrator, traits: [:inactive]
    factory :helpdesk_admin, traits: [:helpdesk]
    factory :system_admin, traits: [:system]
    factory :admin, traits: [:admin]
    factory :realm_admin, traits: [:realm]
    factory :dns_admin, traits: [:dns]
  end
end

因为在大多数情况下我并不关心实际的用户名等。只是它通过了验证。所以我会看一下序列/特征/依赖属性。这样您就可以减少对硬编码数据的依赖。

答案 2 :(得分:0)

您可以使用sequence

生成动态工厂。
factory :user do
  sequence(:name) { |n| "person#{n}" }
  sequence(:date_of_birth) { |n| "#{n}".years.ago }
end

如果您想基于验证来生成出生日期,则可以覆盖用于序列的初始值

sequence(:date_of_birth, 15) { |n| "#{n}".years.ago }