FactoryGirl, why am I already registered or uninitialized?

I am trying to do a simple test for my Course model, I wrote this factory:

 FactoryGirl.define do factory :course do name 'How to be happy ?' end end 

the course_spec.rb:

 require "rspec" require 'factory_girl_rails' describe "When a course is created" do it "can't be deleted if any student is enrolled to it" do FactoryGirl.find_definitions course = FactoryGirl.build(:course) student= Student.create! course.students << student course.destroy course.name.should !=nil end end 

but, I reach this line

 course = FactoryGirl.build(:course) 

I get an error message:

 FactoryGirl::DuplicateDefinitionError: Factory already registered: course 

If I comment on the course definition in the factory, I get:

 NameError: uninitialized constant Course 

Any idea please?

here is my Gem Envioronment:

 RubyGems Environment: RUBYGEMS VERSION: 1.8.10 RUBY VERSION: 1.9.3 (2011-10-30 patchlevel 0) [i686-linux] INSTALLATION DIRECTORY: /home/sam/.rvm/gems/ruby-1.9.3-p0 RUBY EXECUTABLE: /home/sam/.rvm/rubies/ruby-1.9.3-p0/bin/ruby EXECUTABLE DIRECTORY: /home/sam/.rvm/gems/ruby-1.9.3-p0/bin RUBYGEMS PLATFORMS: ruby x86-linux GEM PATHS: /home/sam/.rvm/gems/ruby-1.9.3-p0 /home/sam/.rvm/gems/ ruby-1.9.3-p0@global GEM CONFIGURATION: :update_sources => true :verbose => true :benchmark => false :backtrace => false :bulk_threshold => 1000 REMOTE SOURCES: http://rubygems.org/ ---------------------- IDE: JetBrains RubyMine (EAP) RM-112.291, build #RM-112.291 OS: Linux 3.0.0-12-generic[i386] Java: 1.6.0_23-b23 RubyMine SDK Environment: Sdk: RVM: ruby-1.9.3-p0 Sdk Version: ver.1.9.3p0 ( revision 33570) p0 Ruby Interpreter: /home/sam/.rvm/rubies/ruby-1.9.3-p0/bin/ruby RVM Sdk: yes, gemset:[default] RVM Home: /home/sam/.rvm Sdk Language Level: 1.9 Sdk Load Path: /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1 /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/i686-linux /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/vendor_ruby/1.9.1 /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/vendor_ruby/1.9.1/i686-linux /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/vendor_ruby /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1 /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/i686-linux /home/sam/rubyMine4beta/rubystubs19 Sdk Gem paths: file:///home/sam/.rvm/gems/ruby-1.9.3-p0/bundler/gems file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems file:///home/sam/.rvm/gems/ ruby-1.9.3-p0@global /gems Gems used for 'hope': ffi (1.0.11, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/ffi-1.0.11) sass (3.1.12, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/sass-3.1.12) coffee-script-source (1.2.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/coffee-script-source-1.2.0) mail (2.3.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/mail-2.3.0) activesupport (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/activesupport-3.1.0) i18n (0.6.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/i18n-0.6.0) uglifier (1.2.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/uglifier-1.2.1) sprockets (2.0.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/sprockets-2.0.3) foreigner (1.1.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/foreigner-1.1.1) treetop (1.4.10, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/treetop-1.4.10) haml (3.1.4, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/haml-3.1.4) ansi (1.4.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/ansi-1.4.1) mime-types (1.17.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/mime-types-1.17.2) rack (1.3.6, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rack-1.3.6) devise (1.5.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/devise-1.5.2) warden (1.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/warden-1.1.0) diff-lcs (1.1.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/diff-lcs-1.1.3) activeresource (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/activeresource-3.1.0) sass-rails (3.1.5, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/sass-rails-3.1.5) therubyracer (0.9.9, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/therubyracer-0.9.9) rspec-expectations (2.7.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rspec-expectations-2.7.0) coffee-rails (3.1.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/coffee-rails-3.1.1) activemodel (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/activemodel-3.1.0) simple_form (1.5.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/simple_form-1.5.2) bundler (1.0.21, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.0.21) thor (0.14.6, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/thor-0.14.6) activerecord (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.0) json (1.6.4, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/json-1.6.4) coffee-script (2.2.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/coffee-script-2.2.0) execjs (1.2.13, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/execjs-1.2.13) turn (0.8.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/turn-0.8.3) rake (0.9.2.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2) kaminari (0.13.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/kaminari-0.13.0) rdoc (3.12, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rdoc-3.12) rspec (2.7.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rspec-2.7.0) actionpack (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/actionpack-3.1.0) rspec-rails (2.7.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rspec-rails-2.7.0) guard (0.10.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/guard-0.10.0) cocoon (1.0.15, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/cocoon-1.0.15) libv8 (3.3.10.4, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/libv8-3.3.10.4-x86-linux) rspec-core (2.7.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rspec-core-2.7.1) jquery-rails (1.0.19, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/jquery-rails-1.0.19) rails (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rails-3.1.0) rack-ssl (1.3.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rack-ssl-1.3.2) arel (2.2.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/arel-2.2.1) erubis (2.7.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/erubis-2.7.0) rb-fsevent (0.4.3.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rb-fsevent-0.4.3.1) builder (3.0.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/builder-3.0.0) orm_adapter (0.0.5, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/orm_adapter-0.0.5) rack-cache (1.0.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rack-cache-1.0.3) multi_json (1.0.4, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/multi_json-1.0.4) spork (0.9.0.rc9, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/spork-0.9.0.rc9) tilt (1.3.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/tilt-1.3.3) rack-mount (0.8.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rack-mount-0.8.3) tzinfo (0.3.31, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/tzinfo-0.3.31) validate_url (0.2.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/validate_url-0.2.0) sqlite3 (1.3.5, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/sqlite3-1.3.5) rspec-mocks (2.7.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rspec-mocks-2.7.0) polyglot (0.3.3, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/polyglot-0.3.3) railties (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.0) hike (1.2.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/hike-1.2.1) guard-spork (0.5.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/guard-spork-0.5.0) factory_girl_rails (1.4.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/factory_girl_rails-1.4.0) factory_girl (2.3.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/factory_girl-2.3.2) will_paginate (3.0.2, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/will_paginate-3.0.2) rack-test (0.6.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/rack-test-0.6.1) client_side_validations (3.1.4, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/client_side_validations-3.1.4) actionmailer (3.1.0, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.1.0) bcrypt-ruby (3.0.1, file:///home/sam/.rvm/gems/ruby-1.9.3-p0/gems/bcrypt-ruby-3.0.1) 

EDIT

File spec_helper.rb:

 require 'rubygems' require 'spork' Spork.prefork do # Loading more in this block will cause your tests to run faster. However, # if you change any configuration or code from libraries loaded here, you'll # need to restart spork for it take effect. ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' # 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 config.mock_with :rspec # 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 end end Spork.each_run do # This code will be run each time you run your specs. FactoryGirl.factories.clear # either this if you have multiple files under 'spec/factories', # or just load the single file, such as 'spec/factories.rb' Dir.glob("#{::Rails.root}/spec/factories/*.rb").each do |file| load "#{file}" end end 
+7
source share
5 answers

Have you tried to delete this line?

 FactoryGirl.find_definitions 

I use Factory Girl (with factory_girl_rails gem) and Shoulda with project 3.1 and should not explicitly load definitions.

+18
source

All you have to do is require 'rspec_factory_girl' and then the definitions.

Usually, if you put it in spec_helper.rb , this will require all the files in the spec/ directory, which means that if you have your factories defined, for example, in spec/factories.rb , they will automatically load.

However, you need to add require 'spec_helper' at the top of your spec file, which you don't seem to be doing.

If you do not want to use the spec_helper.rb file spec_helper.rb this way, simply do a manual definition, for example require 'factories' .

One little trick if you use something like spork and you need to restart your factories manually before each run

 FactoryGirl.factories.clear # either this if you have multiple files under 'spec/factories', # or just load the single file, such as 'spec/factories.rb' Dir.glob("#{::Rails.root}/spec/factories/*.rb").each do |file| load "#{file}" end 

edit: full spork example

 Spork.each_run do require 'factory_girl_rails' # reload all the models Dir["#{Rails.root}/app/models/**/*.rb"].each do |model| load model end # reload all factories FactoryGirl.factories.clear Dir.glob("#{::Rails.root}/spec/factories/*.rb").each do |file| load "#{file}" end # reload routes YourAppName::Application.reload_routes! end 
+4
source

I also ran into this error:

 FactoryGirl::DuplicateDefinitionError: Factory already registered: factory_name 

And I fixed the problem by adding :require => false to my Gemfile, like this one:

 gem 'factory_girl_rails', :require => false 

Then require it in test_helper.rb only once, having the following line:

 require 'factory_girl_rails' 
+1
source

Here is what worked for me in Rails 4.2.6

In rails_helper.rb add these libraries

 require 'factory_girl' require 'factory_girl_rails' 

Add them to the configuration part

 config.include FactoryGirl::Syntax::Methods 
+1
source

In my case, this happened when I accidentally put two factory files that contain the same key:

 Rails.root/spec/factories/book.rb Rails.root/spec/factories/books.rb 

This is obvious, but this situation arose when I developed the nogit (!) Environment and placed the source files using rsync (1). When I rename book.rb to books.rb from my local PC and rsync to dev-env, both book.rb and books.rb exist, and this caused a situation here: - (

0
source

All Articles