Gandalf StormCrow
Gandalf StormCrow

Reputation: 26212

FactoryBot to build list of objects with trait

I'm using factory_bot to create objects in my test, here is a example of my factory:

factory :user do
  name "John"
  surname "Doe"

  trait :with_photo do
    ignore do
      photo_count 1
    end

    after(:create) do |user, evaluator|
      FactoryBot.create_list(:photo, evaluator.photo_count)
    end
  end
end

So I can create a user with photo like:

FactoryBot.create(:user, :with_photo)

Or without photo :

FactoryBot.create(:user) 

Or create a list of users :

FactoryBot.build_list(:user, 5)

But how can I build a list of users with trait (trait being :with_photo), if I wanted to create five of them with photo?

Note: FactoryBot was previously called FactoryGirl

Upvotes: 36

Views: 46007

Answers (2)

Thilo
Thilo

Reputation: 17735

Doesn't this work? It should...

FactoryBot.build_list(:user, 5, :with_photo)

Reference

FactoryBot - Building or Creating Multiple Records

Upvotes: 80

theterminalguy
theterminalguy

Reputation: 1941

You can also pass multiple traits to create_list and build_list example;

factory :user do
  name { "Friendly User" }

  trait :male do
    name { "John Doe" }
    gender { "Male" }
  end

  trait :admin do
    admin { true }
  end
end

# creates 3 admin users with gender "Male" and name "Jon Snow" using the admin and male trait
build_list(:user, 3, :admin, :male, name: "Jon Snow")
create_list(:user, 3, :admin, :male, name: "Jon Snow")

Just make sure the traits comes after the number of records you wish to create, the last argument is a hash that would override the record attribute.

More on traits on the official docs

Upvotes: 9

Related Questions