Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Factory not registered

I want to test a model with RSpec but I probably have stumbled on a typo that I just can't find. Can somebody please help me a bit? I've been struggling with it for a long time and just can't find any mistakes. Thank you in advance!

user_spec.rb

require 'spec_helper'  describe User do      it "has a valid factory" do         FactoryGirl.build(:user).should be_valid      end      it "is invalid without an e-mail"      it "is invalid without a correct e-mail"       it "is invalid without a password"       it "is invalid without a matching password confrimation"  end 

user.rb

FactoryGirl.define do     factory :user do |f|         f.email "[email protected]"         f.password "ruby"         f.password_confrimation "ruby"     end end 

spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' require 'factory_girl'  # Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }  RSpec.configure do |config|   # ## Mock Framework   #   # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:   #   # config.mock_with :mocha   # config.mock_with :flexmock   # config.mock_with :rr    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures   config.fixture_path = "#{::Rails.root}/spec/fixtures"    # If you're not using ActiveRecord, or you'd prefer not to run each of your   # examples within a transaction, remove the following line or assign false   # instead of true.   config.use_transactional_fixtures = true    # If true, the base class of anonymous controllers will be inferred   # automatically. This will be the default behavior in future versions of   # rspec-rails.   config.infer_base_class_for_anonymous_controllers = false    # Run specs in random order to surface order dependencies. If you find an   # order dependency and want to debug it, you can fix the order by providing   # the seed, which is printed after each run.   #     --seed 1234   config.order = "random" end 

error

Factory not registered: user 
like image 453
Kert Avatar asked Jun 26 '13 21:06

Kert


2 Answers

You have your factory definition in the wrong file, according to your question it is in user.rb. This needs to be in a factories.rb in your test folder (spec) if you use rspec

# user.rb  FactoryGirl.define do     factory :user do |f|         f.email "[email protected]"         f.password "ruby"         f.password_confrimation "ruby"     end end 

Change above to this, (Also you don't need the f variable)

# spec/factories.rb  FactoryGirl.define do     factory :user do         email "[email protected]"         password "ruby"         password_confrimation "ruby"     end end 

Also as the comments say, make sure gem 'factory_girl_rails' is in your Gemfile, instead of just gem 'factory_girl'

like image 167
fontno Avatar answered Sep 21 '22 05:09

fontno


I had run into the following issue with the structure in my folder factories/ - factories/ -- artists.rb -- techniques.rb

artists.rb

FactoryBot.define do     factory :artist do       name       'Michael'       technique   FactoryBot.create :technique     end   end 

techniques.rb

FactoryBot.define do   factory :technique do     name 'Some name'   end end 

So it was loading artist before technique object were loaded. So it couldn't find it. The solution is to not use nested FactoryBot create in factories or rename your nested factories to something that stands before your parent factory.

I just moved my technique factory. to factories.rb and defined it there. And issue was resolved.

like image 26
zhisme Avatar answered Sep 22 '22 05:09

zhisme