Фабрика уже зарегистрирована: пользователь (FactoryGirl :: DuplicateDefinitionError) - PullRequest
42 голосов
/ 15 февраля 2012

Описание проблемы: - Я настроил 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 ]

36 голосов
/ 17 февраля 2012

Драгоценный камень factory_girl_rails должен требоваться в spec_helper.rb, а не в гемфайле - возможно, вам требуется FactoryGirl дважды, поэтому вы получаете дубликат.

Попробуйте это в своем гемеfile:

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

Затем убедитесь, что в spec_helper требуется фабричная девушка с:

require 'factory_girl_rails'

Кстати - вам не нужны и 1011 *, и rpsec-railsв вашем гемфайле.Вы можете заменить оба следующих кода:

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

В обеих группах требуется rspec, чтобы задачи rake работали в процессе разработки, а тестирование ядра работало в тесте.

22 голосов
/ 29 апреля 2012

У меня недавно была такая же проблема.В моем случае один из файлов в / factories имел окончание _spec.rb (результат творческого использования cp).Он загружался дважды, сначала по rspec, а потом как с завода.

16 голосов
/ 29 августа 2012

У меня тоже была эта проблема. В моем случае было два файла с одинаковым кодом, например:

FactoryGirl.define do
  factory :user do
  end
end

Один файл назывался «Useres.rb», а другой - «User.rb», поэтому я просто удалил «Useres.rb» и исправил ошибку.

15 голосов
/ 10 декабря 2016

Есть ли вероятность, что вы вставили этот целый фрагмент для файла поддержки из документации config?

# 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

Если вы прочитаете комментарии, вы увидите, что вам нужен только один блокили другой.Я сделал эту ошибку и получил ошибку, указанную в вопросе.

9 голосов
/ 14 мая 2013

Позвоните FactoryGirl.define(:user) или FactoryGirl.find_definitions дважды, у вас также есть эта проблема.

Попробуйте удалить второй вызов или:

FactoryGirl.factories.clear
FactoryGirl.find_definitions  
9 голосов
/ 24 января 2013

Другая возможная причина - запасной вызов FactoryGirl.find_definitions. Попробуйте удалить find_definitions, если найдено.

5 голосов
/ 24 октября 2012

Убедитесь, что ваши индивидуальные заводские файлы не заканчиваются на _spec.

2 голосов
/ 26 марта 2014

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


Загрузка фабричной девушки в консоль разработки также сделает это:

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

поднимет FactoryGirl::DuplicateDefinitionError в последовательности под Factory Girl v4.4.0.

Кажется, последовательности обрабатываются по-разному в 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
1 голос
/ 26 февраля 2013

У меня была такая же проблема.Это происходит из-за того, что вы используете гем 'refinerycms-testing'?который требует фабриканта, так что вы должны зафиксировать этот драгоценный камень или зафиксировать драгоценный камень 'factory_girl_rails', не используйте все эти драгоценные камни.

1 голос
/ 26 марта 2013

Пожалуйста, попробуйте выполнить следующие действия

1) Я искал все вхождения "factory_girl" из моего RAILS_ROOT:

найти. имя "* .rb" | xargs grep "factory_girl"

2) Поскольку это было полное приложение-плагин движка, которое я создал с помощью "rails plugin new --mountable", у меня был файл в 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 )} / фабрики / * / .rb"]. Each {| f | требовать f}

4) строка g.fixture_replacement в engine.rb и строка Dir в spec_helper.rb дважды инициализировали фабрики. Я закомментировал один из spec_helper.rb, и исправил проблему .

В качестве альтернативы вы можете оставить в spec_helper.rb и закомментировать в engine.rb.

Оба исправили проблему в моем случае.

...