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.