2012-02-26 78 views
6

我试图在每次运行测试之间重置工厂女孩的“序列”。rspec和工厂女孩的重复工厂错误?

factory_girl 2.6.0factory_girl_rails 1.7.0

我认为要做到这一点,我必须重新加载FactoryGirl定义。我这样做是在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 

添加:

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

信息我下面的错误运行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> 

这似乎是一个复制的时候工厂错误,也许它试图两次加载工厂女孩,但我不明白为什么。

回答

10

它试图加载所有的工厂两次,因为你问它。 更换你到find_definitions电话与

FactoryGirl.reload 

其清除现有的工厂,序列等,然后调用find_definitions