How to create/build multiple instances of a factory in Factory Girl?
There's a couple of options if you want records from the same (base) factory to have different values.
A) Override defined attributes
factory :post, aliases: [:approved_post] do
title "A title"
approved true
end
approved_post = create(:approved_post)
unapproved_post = create(:post, approved: false)
B) Inheritance
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) Sequences
factory :user do
sequence(:email, 1000) { |n| "person#{n}@example.com" }
end
D) Traits
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)
These methods can be combined. This example uses lists and pairs with sequences and overriding.
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)
I prefer to use traits whenever possible, I find them flexible.
This is an older question and answer but it was the first result I found on Google so I thought I would add the following from the docs under the heading Building or Creating Multiple Records:
created_users = FactoryBot.create_list(:user, 25) #creates 25 users
twenty_year_olds = FactoryBot.build_list(:user, 25, date_of_birth: 20.years.ago) #builds 25 users, sets their date_of_birth
If you want to run this in the rails console, consider the following answer here: https://stackoverflow.com/a/23580836/4880924
In the example I just cited, each user would have a different username, provided that sequence
is used in the factory definition (see Mike Lewis' answer above).
There are two steps to using Factories, the first is to define them, and the second is to use them.
1) Define Them:
Factory.define :user do |u|
u.sequence(:email) { |n| "mike#{n}@awesome.com"}
u.password "password123"
end
2) Using Them:
An example would be to use them in a spec:
@user1 = Factory(:user) #has an email of [email protected]
@user2 = Factory(:user) # has an email of [email protected] due to sequences in FG
I'd watch this Railscast to get a better feel for it.