Es gibt mehrere Möglichkeiten, wenn Sie möchten, dass Datensätze aus derselben (Basis-)Fabrik unterschiedliche Werte haben.
A) Definierte Attribute außer Kraft setzen
factory :post, aliases: [:approved_post] do
title "A title"
approved true
end
approved_post = create(:approved_post)
unapproved_post = create(:post, approved: false)
B) Vererbung
factory :post do
title "A title"
factory :approved_post do
approved true
end
factory :unapproved_post do
approved false
end
end
approved_post = create(:approved_post)
unapproved_post = create(:unapproved_post)
C) Sequenzen
factory :user do
sequence(:email, 1000) { |n| "person#{n}@example.com" }
end
D) Eigenschaften
factory :post do
title "My awesome title"
trait(:approved) { approved true }
trait(:unapproved) { approved false }
trait :with_comments do
after(:create) do |instance|
create_list :comment, 2, post: instance
end
end
factory :approved_post_with_comments, traits: [:approved, :with_comments]
end
approved_post_with_comments = create(:approved_post_with_comments)
unapproved_post_with_no_comments = create(:post, :unapproved, title: "Test")
post_with_title = build(:post)
Diese Methoden können kombiniert werden. In diesem Beispiel werden Listen und Paare mit Sequenzen und Overriding verwendet.
factory :user do
sequence(:username) { |n| "user#{n}" }
date_of_birth Date.today
end
# Build a pair and a list of users.
two_newborns = build_pair(:user)
ten_young_adults = build_list(:user, 10, date_of_birth: 20.years.ago)
# Create a pair and a list of users.
two_young_adults = create_pair(:user, date_of_birth: 20.years.ago)
ten_newborns = create_list(:user, 10)
Ich bevorzuge, wann immer möglich, die Verwendung von Merkmalen, da ich sie flexibel finde.