Фабрика уже зарегистрирована: пользователь (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 ]

1 голос
/ 24 марта 2017

У меня была такая же проблема, оказалось, что по умолчанию users.rb создано внутри test/factories, которое было создано командой rails g.Этот файл вызывал конфликт.Ошибка исчезла, когда я удалил файл.

1 голос
/ 05 июля 2012

У меня была такая же проблема - убедитесь, что вы не загружаете FactoryGirl второй раз в файле spec / support / env.rb.

1 голос
/ 16 марта 2012

Я переименовал спецификации / фабрики в spec / setup_data, и проблема исчезла.Попробуйте переименовать спецификации / фабрики во все, что вам подходит, должно работать.

1 голос
/ 24 июня 2017

попробуйте запустить

rake db: test: prepare

1 голос
/ 17 июля 2015

У меня была точно такая же проблема.Это происходит, когда вы используете генератор строительных лесов.Это автоматически создает фабрику в тесте / фабриках / Так что, как правило, удаление этого файла решает вашу проблему

1 голос
/ 29 февраля 2012

У меня такая же проблема.Что я делаю, так это перемещаю spec / factories.rb в spec / factories / role.rb

0 голосов
/ 07 января 2014

Я определил фабрику с тем же именем в factories.rb и обнаружил, что кто-то еще определяет ту же фабрику под каталогом фабрик.Так что на самом деле я могу просто использовать его без определения другого.

0 голосов
/ 10 ноября 2016

Я решил это, потому что пытался создать две фабрики.Моя спецификация функции включала строку:

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

Возвращаясь к своей спецификации функции, я позвонил:

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 }

, как предлагают многие другие ответы.

0 голосов
/ 05 сентября 2016

В моем случае

Сначала мой коллега настроил проект с factory_girl gem с

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

в rails_helper.

Через несколько дней я заменил камень на factory_girl_rails. Поскольку этот новый драгоценный камень также делает это внутренне, фабрики были зарегистрированы дважды. Это было причиной ошибки.

Удалил эту строку из rails_helper, и она заработала.

0 голосов
/ 01 февраля 2013

Убедитесь, что у вас нет нескольких заводов с одинаковым именем, это одна из причин, которая вызывает ошибку

Попытка определить несколько заводов с одинаковым именем вызовет ошибку.

...