FactoryBot to build list of objects with trait
Asked Answered
O

2

35

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

Overwhelm answered 17/1, 2014 at 14:8 Comment(0)
C
79

Doesn't this work? It should...

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

Reference

FactoryBot - Building or Creating Multiple Records

Certainty answered 17/1, 2014 at 14:11 Comment(2)
it wasnt working for me either. Until I realized I was using the plural. usersDiacritical
It seems important to add the traits first after count, followed by specification of other attributes. FactoryGirl.build_list(:user, 5, :with_photo, tag: 'value') It would not work, if you add :with_photo after tag:Subversion
F
9

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

Friedcake answered 20/2, 2020 at 21:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.