Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FactoryGirl — Factory not registered

I've already looked here and here. I'm loading factory_girl_rails fine.

I figured it must be a syntax error, but after an hour of head scratching, really haven't been able to fix it. Can someone please help? :)

Here is my factory:

require 'Faker'

FactoryGirl.define do

  factory :user do
    name { Faker::Name.name }
    email { Faker::Internet.email }
    password { Faker::Lorem.characters 12 }
  end

  trait :with_teams do
    ignore do
      number_of_teams 5
    end

    after :create do |user, evaluator|
      FactoryGirl.create_list :team, evaluator.number_of_teams, :user => user
    end
  end

end

And here is the relevant spec:

require 'spec_helper'

describe User do
  # This works fine
  it "can create a team" do
    user = FactoryGirl.create :user
    team = user.teams.create

    team.class.should == Team
  end

  # The marked line throws argument error
  it "can have many teams" do
    user = FactoryGirl.create :user, :with_teams, :number_of_teams => 10 # <---
    user.teams.length.should == 10
  end
end

And this is the error I'm getting from running the spec:

    Failures:

      1) User can have many teams
         Failure/Error: user = FactoryGirl.create :user, :with_teams, :number_of_teams => 10
         ArgumentError:
           Factory not registered: User
         # ./spec/factories/users.rb:19:in `block (3 levels) in <top (required)>'
         # ./spec/models/user_spec.rb:34:in `block (2 levels) in <top (required)>'
like image 827
Nathan Kot Avatar asked Dec 26 '22 11:12

Nathan Kot


1 Answers

Traits should be inside factories. In your code, :user factory and :with_teams trait are not related.

require 'Faker'

FactoryGirl.define do

  factory :user do
    name { Faker::Name.name }
    email { Faker::Internet.email }
    password { Faker::Lorem.characters 12 }

    trait :with_teams do
      ignore do
        number_of_teams 5
      end

      after :create do |user, evaluator|
        FactoryGirl.create_list :team, evaluator.number_of_teams, :user => user
      end
    end
  end
end
like image 77
Helio Santos Avatar answered Dec 30 '22 07:12

Helio Santos