2012-01-03 17 views
7

Próbuję zrobić prosty test dla mojego modelu Course, ja napisałem ten fabryczne:FactoryGirl, dlaczego jestem już zarejestrowany lub niezainicjowany?

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

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 

ale sięgam tę linię

course = FactoryGirl.build(:course) 

Pojawia się błąd:

FactoryGirl::DuplicateDefinitionError: Factory already registered: course 

gdybym skomentować: definicję przedmiotów w fabryce, uzyskać:

NameError: uninitialized constant Course 

Każdy pomysł, proszę?

tutaj jest mój 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) 

EDIT plik

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

Czy masz golfowe model zdefiniowany jeszcze? –

+0

Tak, kurs jest zdefiniowany w modelach aplikacji, migrowany i znajduje się w nim tabela – simo

+0

Pokaż więcej informacji na temat tego błędu "niezainicjowanej stałej". Naprawdę bardzo ciężko to debugować bez niego. –

Odpowiedz

18

Próbowałeś usunąć tę linię?

FactoryGirl.find_definitions 

Używam Dziewczyna z fabryki (z gem factory_girl_rails) & shoulda z 3.1 projektu i nie trzeba jawnie załadować definicje.

+0

Usunąłem plik FactoryGirl.find_definitions z dwóch plików: najpierw: /home/sam/.rvm/gems/ruby-1.9.3-p0/gems/factory_girl_rails-1.4.0/lib/factory_girl_rails/railtie.rb i działało ! sekunda: /home/sam/Documents/RoR/course_builder/spec/models/course_spec.rb i wszystko działało dobrze! – simo

+0

5 lat później - to pomogło mi – Mark

4

Wszystko, co powinieneś zrobić, to require 'rspec_factory_girl', a następnie definicje.

Generalnie jeśli umieścić go w spec_helper.rb, będzie to wymagało wszystkie pliki w katalogu spec/, co oznacza, jeśli masz swoje fabryki zdefiniowane na przykład w spec/factories.rb, będą ładowane automatycznie.

Wymaga to jednak dodania require 'spec_helper' u góry pliku spec, co wygląda na to, że się nie robi.

Jeśli nie chcesz w ten sposób używać pliku spec_helper.rb, po prostu ręcznie wymaga się określenia, na przykład require 'factories'.

Jeden mały trick jeśli używasz coś jak spork i trzeba przeładować swoje fabryki ręcznie przed każdym biegu

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: kompletny przykładem 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

Kiedy umieścić powyższy kod w rozruchu Spork, otrzymuję ten błąd: Korzystanie RSpec Wgrywanie Rails środowisko Ładowanie blok Spork.prefork ... Fabryka już zarejestrowany: kurs (FactoryGirl :: DuplicateDefinitionError) Zastanawiam się, gdzie jest zarejestrowana fabryka? Dodałem zmianę w pytaniu, aby wyświetlić plik spec_helper.rb. – simo

+0

@SamirSabri gdzie ładujesz dziewczynę z fabryki? Działa to dla mnie, gdy ładuję go w bloku each_run, zobacz edycję dla całego pliku. –

+2

działa dobrze, ale muszę dodać ** FactoryGirl.sequences.clear ** oprócz fabryki.clear, w przeciwnym razie dostałem błąd DoubleDefinition dla moich własnych sekwencji (Mail-Adress itp.) – stwienert

0

W moim przypadku, Stało się, gdy przypadkowo umieścić dwa pliki fabryczne, które zawierają ten sam klucz, jak następuje:

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

Jest to oczywiste, ale taka sytuacja miała miejsce, gdy opracowałem środowisko bez git (!) I wstawiłem pliki źródłowe przez rsync (1). Kiedy zmieniam nazwę book.rb na books.rb z mojego lokalnego komputera i rsync na dev-env, istnieją zarówno book.rb, jak i books.rb, co spowodowało sytuację tutaj ;-(

1

Również napotkałem ten błąd:

FactoryGirl::DuplicateDefinitionError: Factory already registered: factory_name 

I stała się kwestią dodając :require => false w moim Gemfile jak ten:

gem 'factory_girl_rails', :require => false 

Następnie wymagają go w test_helper.rb tylko raz poprzez tę linię:

require 'factory_girl_rails' 
1

Oto co pracował dla mnie w Rails 4.2.6

W rails_helper.rb dodać te Biblioteki

require 'factory_girl' 
require 'factory_girl_rails' 

dodać te do części config

config.include FactoryGirl::Syntax::Methods 
Powiązane problemy