工厂已经注册:user(FactoryGirl :: DuplicateDefinitionError)

时间:2012-02-15 19:47:40

标签: ruby-on-rails factory-bot ruby-on-rails-3.2

问题描述: - 我设置了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

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

编辑:这是我的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

27 个答案:

答案 0 :(得分:36)

factory_girl_rails而不是gemfile中应该需要gem spec_helper.rb - 你可能需要两次FactoryGirl,这就是你获得副本的原因。

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

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

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

require 'factory_girl_rails'

顺便说一下 - 你的gemfile中不需要rspecrpsec-rails。您可以使用以下内容替换它们:

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

您需要在两个组中使用rspec,以便rake任务在开发中起作用,核心测试将在测试中起作用。

答案 1 :(得分:22)

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

答案 2 :(得分:16)

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

FactoryGirl.define do
  factory :user do
  end
end

一个文件名为“Useres.rb”,另一个文件名为“User.rb”,因此我只删除了“Useres.rb”并修复了错误。

答案 3 :(得分:15)

您是否有可能将此整个代码段从配置文档中粘贴到支持文件中?

# 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

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

答案 4 :(得分:9)

另一个可能的原因是FactoryGirl.find_definitions的多余电话。 如果找到,请尝试删除find_definition。

答案 5 :(得分:9)

两次致电FactoryGirl.define(:user)FactoryGirl.find_definitions,您也遇到此问题。

尝试删除第二个电话或:

FactoryGirl.factories.clear
FactoryGirl.find_definitions  

答案 6 :(得分:5)

确保您的各个工厂文件不以_spec结尾。

答案 7 :(得分:2)

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


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

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

将在Factory Girl v4.4.0下的序列上引发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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

我有完全相同的问题。 当您使用脚手架生成器时会发生这种情况。 它会自动在test / factories /中创建一个工厂 因此,通常只需删除此文件即可解决您的问题

答案 10 :(得分:1)

我遇到了同样的问题,结果发现在users.rb内部创建了一个由test/factories命令创建的默认rails g。此文件导致冲突。删除文件后,错误消失了。

答案 11 :(得分:1)

尝试运行

  

rake db:test:prepare

答案 12 :(得分:1)

请尝试执行以下步骤

1)我在RAILS_ROOT中查找了所有出现的“factory_girl”:

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

2)因为这是我通过“rails plugin new --mountable”创建的完整引擎插件“app”,所以我在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 |要求f}

4)engine.rb中的g.fixture_replacement行和spec_helper.rb中的Dir行正在初始化工厂两次。我在spec_helper.rb中注释掉了那个,并且修复了问题

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

两者都解决了我的问题。

答案 13 :(得分:1)

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

    #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 

答案 14 :(得分:1)

我遇到了同样的问题 - 请确保您没有在spec / support / env.rb文件中第二次加载FactoryGirl。

答案 15 :(得分:1)

我将spec / factory重命名为spec / setup_data,问题就消失了。 尝试将规范/工厂重命名为适合您的任何东西,应该可行。

答案 16 :(得分:0)

最奇怪的是,我在代码中出现以下语法错误时出现此错误:

before_validation :generate_reference, :on: :create

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

答案 17 :(得分:0)

我通过从命令行删除spec/factories/xxx.rb来解决它:

rspec spec/factories/xxx.rb spec/model/xxx.rb # before
rspec spec/model/xxx.rb # after

答案 18 :(得分:0)

对我来说,这个问题来了,因为同时使用了两个宝石

onClick(event:any) {
    event.stopPropagation();

        console.log(event);

        const newEvent = Object.assign({}, event, { type: 'dxcontextmenu' });
        console.log(newEvent);
        event.target.dispatchEvent(newEvent);

    // event.target.dispatchEvent(new Event('dxcontextmenu', { bubbles: true }));

  }

要解决,我从gem文件中删除了gem 'factory_bot_rails' gem 'factory_girl_rails' 。 并将gem 'factory_bot_rails'添加到require 'factory_girl'文件中。

spec/factories/track.rb

我希望这会有所帮助。

答案 19 :(得分:0)

我解决了这个问题,因为我试图创建两个工厂。我的功能规格包括以下行:

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

然后我使用了sign_up(用户)辅助方法:

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

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

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

...

因此有效地尝试注册已经由工厂创建的用户。

我将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参数由于let!块而导致数据库中的用户创建,sign_up(user)将其记录下来。

希望这有助于某人!

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

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

正如很多其他答案所暗示的那样。

答案 20 :(得分:0)

就我而言,

首先,我的同事使用factory_girl gem with

设置项目
Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }
rails_helper中的

几天后,我用factory_girl_rails取代了宝石。由于这种新宝石也在内部进行,所以工厂注册了两次。这导致了错误。

rails_helper删除该行并且它有效。

答案 21 :(得分:0)

检查是否通过模型生成器添加了工厂。我的生成器制作了一个模型,我在我的主factory.rb文件中添加了一个。删除自动生成的那些对我有用。

答案 22 :(得分:0)

使用rspec-rails和factory_girl_rails

替换refinerycms-testing gem

答案 23 :(得分:0)

我在factories.rb中定义了同名工厂,我发现其他人在工厂目录下定义了同一个工厂。所以实际上我可以在不定义另一个的情况下使用它。

答案 24 :(得分:0)

我也遇到了同样的问题并在spec_helper.rb文件中注释了一行解决了我的问题。

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

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

答案 25 :(得分:0)

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

答案 26 :(得分:-1)

检查您是否有多个具有相同名称的工厂,这是导致错误的原因之一

尝试定义具有相同名称的多个工厂会引发错误。

相关问题