工厂已经注册:用户(FactoryGirl :: DuplicateDefinitionError)

问题描述: – 我设置了factory_girl_rails但是每当我尝试加载一个工厂,它试图加载它多次。

Environment: - rails (3.2.1) - factory_girl (2.5.2) - factory_girl_rails (1.6.0) - ruby-1.9.3-p0 [ x86_64 ] > rake spec --trace ** Execute environment -- Creating User Factory -- Creating User Factory rake aborted! Factory already registered: user 

我改变的另外一件事是:/config/initializers/generator.rb

 Rails.application.config.generators do |g| g.test_framework = :rspec g.fixture_replacement :factory_girl end 

的Gemfile

 gem 'rails', '3.2.1' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' group :assets do gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' gem 'uglifier', '>= 1.0.3' end gem 'jquery-rails' gem 'devise' gem 'haml-rails' group :development do gem 'hpricot' gem 'ruby_parser' gem "rspec-rails" end group :test do gem "rspec" gem 'factory_girl_rails' end gem 'refinerycms-core', :git => 'git://github.com/resolve/refinerycms.git' gem 'refinerycms-dashboard', :git => 'git://github.com/resolve/refinerycms.git' gem 'refinerycms-images', :git => 'git://github.com/resolve/refinerycms.git' gem 'refinerycms-pages', :git => 'git://github.com/resolve/refinerycms.git' gem 'refinerycms-resources', :git => 'git://github.com/resolve/refinerycms.git' gem 'refinerycms-settings', :git => 'git://github.com/resolve/refinerycms.git' group :development, :test do gem 'refinerycms-testing', :git => 'git://github.com/resolve/refinerycms.git' end gem 'refinerycms-inventories', :path => 'vendor/engines' FactoryGirl.define do factory :role do title "MyString" end end 

这似乎是一个兼容性/环境问题,我似乎无法弄清楚。 有什么build议么?

编辑 :这是我的spec / spec_helper.rb:

 ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' #require 'factory_girl_rails' # 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 # 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 

gem factory_girl_rails应该在spec_helper.rb而不是gemfile中被需要 – 可能你需要两次FactoryGirl,这就是为什么你得到了重复。

在你的gem文件中试试这个:

 group :test do gem "rspec" gem 'factory_girl_rails', :require => false end 

然后确保spec_helper中的工厂女孩​​是必需的:

 require 'factory_girl_rails' 

顺便说一句 – 你不需要在你的gemfile中同时使用rspecrpsec-rails 。 你可以用下面的代码replace它们:

 group :development, :test do gem 'rspec-rails' end 

你需要两个组的rspec,以便rake任务将在开发中工作,核心testing将在testing中工作。

我最近有同样的问题。 在我的情况下,/工厂中的一个文件有一个_spec.rb结尾(创造性cp使用的结果)。 它被加载两次,首先是rspec,然后是工厂。

我也有这个问题。 在我的情况下,有两个文件具有相同的代码,如下所示:

 FactoryGirl.define do factory :user do end end 

一个文件被命名为“Useres.rb”和另一个“User.rb”,所以我刚刚删除“Useres.rb”并修正了错误。

另一个可能的原因是FactoryGirl.find_definitions空闲调用。 如果find,尝试删除find_definitions。

是否有机会从configuration文件粘贴这个支持文件的整个片段?

 # RSpec # spec/support/factory_girl.rb RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods end # RSpec without Rails RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods config.before(:suite) do FactoryGirl.find_definitions end end 

如果你阅读评论,你会看到你只想要一个块或另一个。 我犯了这个错误,并得到了问题中的错误。

调用FactoryGirl.define(:user)FactoryGirl.find_definitions两次,你也有这个问题。

尝试删除第二个电话或:

 FactoryGirl.factories.clear FactoryGirl.find_definitions 

确保你的单个工厂文件不以_spec结尾。

我有同样的问题。 我所做的是将spec / factories.rb移动到spec / factories / role.rb

我把规格/工厂改名为spec / setup_data,问题没有了。 尝试将规范/工厂重命名为适合你的任何应用程序。

我有同样的问题 – 确保你没有在spec / support / env.rb文件中第二次加载FactoryGirl。

我有同样的问题。 这是因为你使用gem'refinerycmstesting'? 这需要工厂女孩,所以你应该承诺这个gem,或者提交gem'factory_girl_rails',不要使用所有这些gem。

  #gem 'refinerycms-testing', '~> 2.0.9', :group => :test gem 'factory_girl_rails', :group => :test 

要么

  #gem 'factory_girl_rails', :group => :test gem 'refinerycms-testing', '~> 2.0.9', :group => :test 

请尝试以下步骤

1)我从RAILS_ROOT中查找了所有“factory_girl”事件:

找 。 -name“* .rb”| xargs grep“factory_girl”

2)因为这是一个完整的引擎插件“应用程序”,我通过“轨道插件新–mountable”创build,我有一个文件下RAILS_ROOT / / lib /所谓的“engine.rb”。 它有过:

 config.generators do |g| g.test_framework :rspec, :fixture => false g.fixture_replacement :factory_girl, :dir => 'spec/factories' g.assets false g.helper false end 

3)我也有我的spec_helper.rb文件中的以下内容:

Dir [“#{File.dirname( FILE )} / factories / * / .rb”]。 要求f}

4)engine.rb中的g.fixture_replacement行和spec_helper.rb中的Dir行正在初始化工厂两次。 我从spec_helper.rb注释掉了这个问题,解决了这个问题

或者,您可以在spec_helper.rb中留下并在engine.rb中注释掉。

这两个问题都解决了我的问题。

https://github.com/thoughtbot/factory_girl/issues/638


将工厂女孩加载到开发控制台也会这样做:

 require 'factory_girl_rails'; reload!; FactoryGirl.factories.clear; FactoryGirl.find_definitions 

会在Factory Girl FactoryGirl::DuplicateDefinitionError下的序列上引发FactoryGirl::DuplicateDefinitionError

看起来FG中的序列得到了不同的处理,只是将所有的序列包装在一个救援块中就可以解决问题。

例如:

  begin sequence :a_sequence do |n| n end sequence :another_sequence do |n| n*2 end rescue FactoryGirl::DuplicateDefinitionError => e warn "#{e.message}" end 

我有完全一样的问题。 它发生在使用脚手架发生器时。 它会自动在testing/工厂/创build一个工厂/所以通常只是删除这个文件解决您的问题

我有同样的问题,事实certificate有一个默认的users.rb创build内部的test/factories是由rails g命令创build的。 这个文件导致了冲突。 删除文件时错误消失了。

我刚刚发现我不小心调用cucumber features时得到了这个答案。 当我刚打电话给cucumber ,问题就消失了。

我也运行相同的问题,并注释掉spec_helper.rb文件中的一行,解决了我的问题。

尝试从spec_helper.rb文件注释掉这一行,你应该很好。

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

我在factories.rb中定义了同一个工厂,我发现其他人在工厂目录下定义了同一个工厂。 所以实际上我可以直接使用它而不需要定义另一个。

用rspec-rails和factory_girl_railsreplacerefinerycms-testing gem

检查是否通过模型生成器添加了工厂。 我的发电机做了一个模型,我添加了一个到我的主factory.rb文件。 删除自动生成的为我工作。

就我而言,

首先,我的同事已经用factory_girl gem设置了这个项目

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

rails_helper

几天之后,我用factory_girl_rails取代了gem。 由于这个新的gem也在内部做到这一点,所以工厂注册了两次。 这是导致错误。

rails_helper删除了这行,它工作。

我解决了这个问题,因为我试图创build两个工厂。 我的function规格包括:

 let!(:user) { create(:user) } 

然后我使用了一个sign_up(user)辅助方法:

 def sign_up(user) visit '/users/sign_up' fill_in 'Email', with: user.email fill_in 'Password', with: user.password fill_in 'Password confirmation', with: user.password_confirmation click_button 'Sign up' end 

回到我的function规范,我打电话给:

 context 'logging out' do before do sign_up(user) end ... 

从而有效地尝试注册已经由工厂创build的用户。

我改变了sign_up(user) sign_in(user) ,帮手:

 def sign_in(user) visit '/users/sign_in' fill_in 'Email', with: user.email fill_in 'Password', with: user.password click_button 'Log in' end 

现在user参数在数据库中创build用户由于let! 块和sign_up(user)login他们。

希望这可以帮助别人!

哦! 我也不得不发表评论:

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

作为很多其他答案的build议。

尝试运行

耙db:testing:准备

最奇怪的是,我得到了这个错误在代码中的以下语法错误:

 before_validation :generate_reference, :on: :create 

:on:导致了这个错误。 如何或为何仍然是一个谜。

检查你没有多个同名的工厂,这是导致错误的原因之一

试图用相同的名字定义多个工厂会引发错误。