2012-01-03 13 views
7

que estoy tratando de hacer una prueba simple para mi modelo Course, he escrito esta fábrica:FactoryGirl, ¿por qué ya estoy registrado o no inicializado?

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

la 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 

pero, llego a esta línea

course = FactoryGirl.build(:course) 

Me aparece el error:

FactoryGirl::DuplicateDefinitionError: Factory already registered: course 

Si comento el: definición de golf en la fábrica, me sale:

NameError: uninitialized constant Course 

Cualquier idea por favor?

aquí es mi 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/[email protected] 
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/[email protected]/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) 

editar el archivo

El 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 
+0

¿Tiene un Curso modelo definido todavía? –

+0

Sí, el curso está definido en modelos de aplicación, migrado y hay una tabla para él – simo

+0

Mostrar más información sobre este error de "constante no inicializada", por favor. Realmente es muy difícil depurarlo sin él. –

Respuesta

18

¿Usted intentó eliminar esta línea?

FactoryGirl.find_definitions 

estoy usando Factory Girl (con la gema factory_girl_rails) & Shoulda con un proyecto de 3.1 y no tener que cargar explícitamente las definiciones.

+0

Eliminé FactoryGirl.find_definitions de dos archivos: primero: /home/sam/.rvm/gems/ruby-1.9.3-p0/gems/girl_girl_rails-1.4.0/lib/factory_girl_rails/railtie.rb y funcionó ! segundo: /home/sam/Documents/RoR/course_builder/spec/models/course_spec.rb ¡y funcionó bien! – simo

+0

5 años más tarde - esto me ayudó a salir – Mark

4

Todo lo que debe hacer es require 'rspec_factory_girl' y luego las definiciones.

En general, si lo pones en el spec_helper.rb, se requerirá que todos los archivos en el directorio spec/, lo que significa que si usted tiene sus fábricas definidos por ejemplo en spec/factories.rb, ellos se cargan automáticamente.

Eso sin embargo requiere que agregue require 'spec_helper' en la parte superior de su archivo de especificaciones, lo que parece que no está haciendo.

Si no desea utilizar el archivo spec_helper.rb de esta manera, simplemente solicite manualmente la definición, como require 'factories'.

Un pequeño truco si usted está usando algo como spork y la necesidad de recargar sus fábricas manualmente antes de cada ejecución

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 

edición: ejemplo completo de Spork

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 
+0

Cuando pongo el código anterior en la partida spork, me sale este error: Usando RSpec rieles Precarga ambiente Cargando bloque Spork.prefork ... fábrica ya registrado: Curso (FactoryGirl :: DuplicateDefinitionError) Me pregunto dónde se registró la fábrica? He agregado una edición en la pregunta para mostrarle el spec_helper.rb. – simo

+0

@SamirSabri ¿dónde estás cargando a la chica de la fábrica? Funciona para mí cuando lo cargo en el bloque each_run, vea editar para todo el archivo. –

+2

funciona bien, pero necesitaba agregar ** FactoryGirl.sequences.clear ** además de factories.clear, de lo contrario obtuve el error de DoubleDefinition para mis secuencias personalizadas (direcciones de correo, etc.) – stwienert

0

En mi caso, sucedió cuando puse accidentalmente dos archivos de fábrica que contienen la misma clave de la siguiente manera:

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

Esto es obvio, pero esta situación sucedió cuando desarrollé en un entorno no-git (!) Y puse los archivos fuente por rsync (1). Cuando cambio el nombre de book.rb a books.rb desde mi PC local y rsync a dev-env, existen tanto book.rb como books.rb y esto causó la situación aquí ;-(

1

También encontré este error:

FactoryGirl::DuplicateDefinitionError: Factory already registered: factory_name 

Y he arreglado el problema agregando :require => false en mi Gemfile como éste:

gem 'factory_girl_rails', :require => false 

Entonces requieren en el test_helper.rb sólo una vez por tener esta línea:

require 'factory_girl_rails' 
1

Esto es lo que funcionó para mí en Rails 4.2.6

En rails_helper.rb añadir estas librerias

require 'factory_girl' 
require 'factory_girl_rails' 

añadir estos a la parte de configuración

config.include FactoryGirl::Syntax::Methods 
Cuestiones relacionadas