2012-01-03 10 views
7

Sto cercando di fare un semplice test per il mio modello Course, ho scritto questa fabbrica:FactoryGirl, perché sono già registrato o non inizializzato?

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

il 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 

ma, raggiungo questa linea

course = FactoryGirl.build(:course) 

Ho ricevuto l'errore:

FactoryGirl::DuplicateDefinitionError: Factory already registered: course 

se io commento la: definizione di corso nella fabbrica, ottengo:

NameError: uninitialized constant Course 

Qualche idea per favore?

qui è la mia gemma 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) 

EDIT file di

Lo 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

Hai un corso modello definito ancora? –

+0

Sì, il corso è definito nei modelli di app, migrato e c'è una tabella per esso – simo

+0

Mostra ulteriori informazioni su questo errore "costante non inizializzata" per favore. Davvero molto difficile eseguirne il debug senza –

risposta

18

Hai provato a rimuovere questa riga?

FactoryGirl.find_definitions 

Sto usando Factory Girl (con il factory_girl_rails gemma) & Shoulda con un progetto 3.1 e non ho dovuto caricare in modo esplicito le definizioni.

+0

Ho rimosso FactoryGirl.find_definitions da due file: prima: /home/sam/.rvm/gems/ruby-1.9.3-p0/gems/factory_girl_rails-1.4.0/lib/factory_girl_rails/railtie.rb e ha funzionato ! secondo: /home/sam/Documents/RoR/course_builder/spec/models/course_spec.rb e ha funzionato bene! – simo

+0

5 anni più tardi - questo mi ha aiutato – Mark

4

Tutto quello che dovresti fare è require 'rspec_factory_girl' e poi le definizioni.

Generalmente se lo metti nella spec_helper.rb, richiederà tutti i file nella directory spec/, il che significa che se avete le vostre fabbriche definiti ad esempio nel spec/factories.rb, avranno caricato automaticamente.

Questo tuttavia richiede di aggiungere require 'spec_helper' nella parte superiore del file spec, che sembra non si sta facendo.

Se non si desidera utilizzare il file spec_helper.rb in questo modo, poi basta richiedere manualmente la definizione, come ad esempio require 'factories'.

Un piccolo trucco se stai usando qualcosa come spork e la necessità di caricare manualmente le fabbriche prima di ogni corsa

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: completo esempio di 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

Quando ho messo il codice sopra nella partenza Spork, ottengo questo errore: Utilizzando RSpec precarico Rails ambiente Caricamento blocco Spork.prefork ... fabbrica già registrato: corso (FactoryGirl :: DuplicateDefinitionError) Mi chiedo dove si è registrata la fabbrica? Ho aggiunto una modifica nella domanda per mostrare spec_helper.rb. – simo

+0

@SamirSabri dove stai caricando la ragazza della fabbrica? Funziona per me quando lo carico nel blocco each_run, vedi modifica per l'intero file. –

+2

funziona bene, ma ho bisogno di aggiungere ** FactoryGirl.sequences.clear ** oltre a factories.clear, altrimenti ho ottenuto l'errore DoubleDefinition per le mie sequenze personalizzate (Mail-Adresses ecc.) – stwienert

0

Nella mia caso, è accaduto quando ho accidentalmente messo due file di fabbrica che contengono la stessa chiave come segue:

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

Questo è ovvio, ma questa situazione si è verificata quando mi sono sviluppato in ambiente no-git (!) E ho inserito file sorgente da rsync (1). Quando ho rinominare book.rb a books.rb dal mio PC locale e rsync a dev-ENV, sia book.rb e books.rb esistono e questo ha causato la situazione qui ;-(

1

Ho anche incontrato questo errore:

FactoryGirl::DuplicateDefinitionError: Factory already registered: factory_name 

E ho risolto il problema aggiungendo :require => false nel mio Gemfile come questo:

gem 'factory_girl_rails', :require => false 

Poi richiedono nel test_helper.rb solo una volta da avere questa linea:

require 'factory_girl_rails' 
1

Ecco cosa ha funzionato per me in Rails 4.2.6

In rails_helper.rb aggiungere questi librarys

require 'factory_girl' 
require 'factory_girl_rails' 

aggiungere questi alla parte config

config.include FactoryGirl::Syntax::Methods 
Problemi correlati