2012-02-26 13 views
6

Tôi đang cố gắng đặt lại "chuỗi" trong nhà máy nữ giữa mỗi lần chạy thử.Lỗi nhà máy trùng lặp với rspec và nhà máy nữ?

(factory_girl 2.6.0factory_girl_rails 1.7.0)

Tôi nghĩ rằng làm như vậy, tôi phải tải lại các định nghĩa FactoryGirl. Tôi làm điều đó trong những dòng cuối cùng của spec_helper.rb:

require 'rubygems' 
require 'spork' 
#uncomment the following line to use spork with the debugger 
#require 'spork/ext/ruby-debug' 

Spork.prefork do 
    ENV["RAILS_ENV"] ||= 'test' 
    require File.expand_path("../../config/environment", __FILE__) 
    require 'rspec/rails' 
    require 'rspec/autorun' 
    require 'capybara/rspec' 

    require "rails/application" 
    Spork.trap_method(Rails::Application::RoutesReloader, :reload!) 

    Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

    RSpec.configure do |config| 
    config.mock_with :rspec 

    require 'database_cleaner' 
    config.before(:suite) do 
     DatabaseCleaner.strategy = :transaction 
     DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
     DatabaseCleaner.start 
    end 

    config.after(:each) do 
     DatabaseCleaner.clean 
    end 

    config.infer_base_class_for_anonymous_controllers = false 

    # For mailer 
    config.include(MailerMacros) 
    config.before(:each) {reset_email} 
    end 

end 

Spork.each_run do 
    # This code will be run each time you run your specs. 
    I18n.backend.reload! 
    Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 
    require 'factory_girl' 
    FactoryGirl.definition_file_paths = [File.join(Rails.root, 'spec', 'factories')] 
    FactoryGirl.find_definitions 
end 

Thêm:

FactoryGirl.definition_file_paths = [File.join(Rails.root, 'spec', 'factories')] 
    FactoryGirl.find_definitions 

Dẫn tôi đến lỗi sau khi chạy rspec spec/

→ bundle exec guard 
Guard uses Growl to send notifications. 
Guard is now watching at '/Rails/projects/MyRailsProject' 
Starting Spork for RSpec 
Using RSpec 
Preloading Rails environment 
Loading Spork.prefork block... 
Spork is ready and listening on 8989! 
Spork server for RSpec successfully started 
Guard::RSpec is running, with RSpec 2! 
Running all specs 
Exception encountered: #<FactoryGirl::DuplicateDefinitionError: Factory already registered: user> 

Mà có vẻ là một nhân đôi lỗi nhà máy, có thể nó đang cố gắng tải nhà máy nữ hai lần, nhưng tôi không hiểu tại sao.

Trả lời

10

Nó đang cố gắng tải tất cả các nhà máy của bạn hai lần, bởi vì bạn đang yêu cầu nó. Thay thế cuộc gọi của bạn để find_definitions với

FactoryGirl.reload 

mà rõ ràng trong các nhà máy hiện có, chuỗi vv và sau đó gọi find_definitions cho bạn