工厂已经注册:用户(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中同时使用rspec
和rpsec-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:
导致了这个错误。 如何或为何仍然是一个谜。
检查你没有多个同名的工厂,这是导致错误的原因之一
试图用相同的名字定义多个工厂会引发错误。