Подтвердить что ты не робот

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
4b9b3361

Ответ 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

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

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