Getting FactoryBot::DuplicateDefinitionError: Factory already registered

Viewed 4929

I am getting FactoryBot::DuplicateDefinitionError:Factory already registered:user error when I run the user spec. I want to create multiple object of user with different name and age. my user.rb in factories dir is

FactoryBot.define do
   @users = [{display_name: 'abc', age: 25}, {display_name: 'xyz', age: 30}]

  @users.each do |user|
    factory :user do
      display_name user[:display_name]
      age user[:age]
    end
  end
end

is anything wrong with this code? Thanks

4 Answers

I believe this is a good case for using FactoryBot's traits.

There can ever only be one named factory, but traits allow variations to that named factory.

Consider something like this:

FactoryBot.define do
  factory :user do
    trait :bob do
      display_name { 'Bob' }
      age { 30 }
    end

    trait :jimmy do
      display_name { 'Jimmy' }
      age { 26 }
    end
  end
end

And then, when you need Jimmy, you can call the user factory like this:

FactoryBot.create :user, :jimmy

Or if you need bob, call it like this:

FactoryBot.create :user, :bob

Hope this helps.

You should call your factories (with different attributes) from the specs you're running.

The factory:

FactoryBot.define do
  factory :user do
    display_name { "bob" }
    age { 30 }
  end
end

And in the spec:

let(:bob) { create(:user) }
let(:jimmy) { create(:user, display_name: "jimmy", age: 25) }

Or if you really want to iterate through your original array:

@users = [{display_name: 'abc', age: 25}, {display_name: 'xyz', age: 30}]
@users.each do |user|
  create(:user, display_name: user[:display_name], age: user[:age])

end

You need to verify the /test/factories directory, maybe rails generator created a factory to user

I got this error and I fixed by collecting all files in ./spec/factories directory into one file ./spec/support/factory_models.rb and add require 'support/factory_models' in rails_helper.rb

however, whenever i generate a new model, i must cut/paste factory code of new model into factory_models.rb by hang.

Related