Factory уже зарегистрирован: пользователь (FactoryGirl:: DuplicateDefinitionError)
Описание проблемы:
- У меня setup factory_girl_rails, но всякий раз, когда я пытаюсь загрузить factory, он пытается загрузить его несколько раз.
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
Кажется, это проблема совместимости/среды, которую я не могу понять. Любые предложения?
EDIT: здесь my 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
Ответы
Ответ 1
Драгоценный камень factory_girl_rails
должен быть необходим в spec_helper.rb
, а не в gemfile - возможно, что вам требуется FactoryGirl дважды, поэтому вы получаете дубликат.
Попробуйте это в своем файле gem:
group :test do
gem "rspec"
gem 'factory_girl_rails', :require => false
end
Затем убедитесь, что девушка factory требуется в spec_helper с:
require 'factory_girl_rails'
Кстати, вам не нужны как rspec
, так и rpsec-rails
в вашем gemfile. Вы можете заменить оба на следующее:
group :development, :test do
gem 'rspec-rails'
end
Вам нужна rspec в обеих группах, чтобы задачи грабли работали в процессе разработки, и основное тестирование будет работать в тесте.
Ответ 2
У меня была такая же проблема в последнее время. В моем случае один из файлов в/фабрики имел конец _spec.rb(результат использования тэга creat). Он загружался дважды, сначала rspec, а затем как factory.
Ответ 3
У меня тоже была эта проблема. В моем случае было два файла с одинаковым кодом, например:
FactoryGirl.define do
factory :user do
end
end
Один файл был назван "Useres.rb", а другой "User.rb", поэтому я просто удалил "Useres.rb" и исправил ошибку.
Ответ 4
Другая возможная причина - это бесплатный вызов FactoryGirl.find_definitions
.
Попробуйте удалить find_definitions, если он найден.
Ответ 5
Есть ли вероятность, что вы вставили весь этот фрагмент файла поддержки из файлов конфигурации?
# 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
Если вы прочтете комментарии, вы увидите, что вам нужен только один блок или другой. Я сделал эту ошибку и получил ошибку, указанную в вопросе.
Ответ 6
Вызов FactoryGirl.define(:user)
или FactoryGirl.find_definitions
дважды, у вас также есть эта проблема.
Попробуйте удалить второй вызов или:
FactoryGirl.factories.clear
FactoryGirl.find_definitions
Ответ 7
Убедитесь, что ваши отдельные файлы factory не заканчиваются на _spec
.
Ответ 8
У меня такая же проблема. То, что я делаю, это переместить spec/factories.rb в spec/factories/role.rb
Ответ 9
Я переименовал spec/factory как spec/setup_data, и проблема исчезла.
Попробуйте переименовать спецификацию/фабрики на все, что вам подходит, должно работать.
Ответ 10
У меня была та же проблема: убедитесь, что вы не загружаете FactoryGirl во второй раз в файл spec/support/env.rb.
Ответ 11
У меня была такая же проблема. Это происходит из-за того, что вы используете gem 'refinerycms-testing'? для которой требуется factory -girl, поэтому вы должны зафиксировать этот камень или зафиксировать драгоценный камень "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
Ответ 12
Попробуйте выполнить следующие шаги.
1) Я искал все вхождения "factory_girl" из моего RAILS_ROOT:
найти. -name "*.rb" | xargs grep "factory_girl"
2) Поскольку это был полный "плагин" плагина, который я создал через "rails plugin new --mountable", у меня был файл под RAILS_ROOT//lib/called "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.
Оба исправили проблему в моем случае.
Ответ 13
https://github.com/thoughtbot/factory_girl/issues/638
Загрузка factory девушки в консоль разработки также сделает это:
require 'factory_girl_rails'; reload!; FactoryGirl.factories.clear; FactoryGirl.find_definitions
поднимет a 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
Ответ 14
У меня была точно такая же проблема.
Это происходит, когда вы используете генератор эшафотов.
Он автоматически создает factory в тесте/фабриках/
Таким образом, просто удалив этот файл, решите проблему.
Ответ 15
У меня была та же проблема, оказалось, что в test/factories
создан test/factories
по умолчанию users.rb
, который был создан командой rails g
. Этот файл вызывал конфликт. Ошибка удалилась, когда я удалил файл.
Ответ 16
Я только что нашел, что получаю этот ответ, когда случайно звонил cucumber features
. Когда я только что вызвал cucumber
, проблема исчезла.
Ответ 17
Я также работал с той же проблемой, и комментируя одну строку в файле spec_helper.rb, я решил проблему.
Попробуйте прокомментировать эту строку из файла spec_helper.rb, и вам должно быть хорошо.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
Ответ 18
Я определил одно и то же имя factory на factories.rb, и я просто обнаружил, что кто-то другой определяет тот же factory под каталогом фабрик. Поэтому я могу просто использовать его, не определяя другого.
Ответ 19
Замените жемчужину для тестирования нефтепродуктов rspec-rails и factory_girl_rails
Ответ 20
Проверьте, добавили ли вы фабрики через генератор модели. Мой генератор сделал модель, и я добавил ее в свой основной файл factory.rb. Удаление автоматически сгенерированных я работал у меня.
Ответ 21
В моем случае
Сначала мой сотрудник установил проект с factory_girl
драгоценным камнем с
Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }
в rails_helper
.
Через несколько дней я заменил драгоценный камень factory_girl_rails
. Так как этот новый камень также делает это, внутренние заводы были зарегистрированы дважды. Это вызвало ошибку.
Удалена эта строка из rails_helper
, и она сработала.
Ответ 22
Я решил это, потому что пытался создать две фабрики. В мою спецификацию включена строка:
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
...
таким образом эффективно пытается зарегистрировать пользователя, который уже был создан factory.
Я изменил значение 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
создает пользователя в db из-за блока let!
, а sign_up(user)
записывает их.
Надеюсь, это поможет кому-то!
о! и мне также пришлось прокомментировать:
Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }
как и многие другие рекомендации.
Ответ 23
попробуйте запустить
rake db: test: подготовить
Ответ 24
Самое странное, я получил эту ошибку со следующей синтаксической ошибкой в коде:
before_validation :generate_reference, :on: :create
:on:
вызывало эту ошибку. Как и почему останется загадкой.
Ответ 25
Убедитесь, что у вас нет нескольких фабрик с одинаковым именем, это одна из причин, которая вызывает ошибку
Попытка определить несколько фабрик с тем же именем приведет к возникновению ошибки.