web-dev-qa-db-fra.com

Usine déjà enregistrée: utilisateur (FactoryGirl :: DuplicateDefinitionError)

Description du problème: - J'ai configuré factory_girl_Rails, mais chaque fois que j'essaie de charger une fabrique, elle essaie de la charger plusieurs fois.

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

La seule autre chose que j'ai modifiée est la suivante: /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

Cela semble être un problème de compatibilité/environnement que je n'arrive pas à comprendre. Aucune suggestion?

EDIT: voici mon 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
39
user1212241

Le gem factory_girl_Rails devrait être requis dans le spec_helper.rb plutôt que dans le fichier gem - il est possible que vous ayez besoin de FactoryGirl à deux reprises, raison pour laquelle vous obtenez le double.

Essayez ceci dans votre fichier bijou:

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

Ensuite, assurez-vous que la fille d’usine est requise dans le spec_helper avec:

require 'factory_girl_Rails'

Soit dit en passant, vous n'avez pas besoin de rspec et rpsec-Rails dans votre fichier gem. Vous pouvez remplacer les deux par les éléments suivants:

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

Vous avez besoin de rspec dans les deux groupes pour que les tâches de rake fonctionnent en développement et les tests de base en test.

36
nmott

J'ai eu le même problème récemment. Dans mon cas, l’un des fichiers de/factories avait une fin _spec.rb (résultat de l’utilisation de Creative cp). Il chargeait deux fois, d'abord par RSPEC, puis en tant qu'usine.

21
yellowKompressor

J'ai eu ce problème également. Dans mon cas, il y avait deux fichiers avec le même code, comme ceci:

FactoryGirl.define do
  factory :user do
  end
end

Un fichier s'appelait "Useres.rb" et l'autre "User.rb", je viens donc de supprimer "Useres.rb" et de corriger l'erreur.

15
Eduardo Leal

Existe-t-il une chance que vous ayez collé ce entier extrait pour le fichier de support à partir de la documentation de configuration?

# 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

Si vous lisez les commentaires, vous verrez que vous ne voulez que l'un ou l'autre bloc. J'ai commis cette erreur et j'ai obtenu l'erreur mentionnée dans la question.

14
Ryan Bosinger

Une autre raison possible est l’appel de secours de FactoryGirl.find_definitions. Essayez de supprimer find_definitions s’il est trouvé.

9
Denis Kreshikhin

Appelez FactoryGirl.define(:user) ou FactoryGirl.find_definitions deux fois, vous avez également ce problème. 

Essayez de supprimer le deuxième appel ou:

FactoryGirl.factories.clear
FactoryGirl.find_definitions  
9
Moriarty

Assurez-vous que vos fichiers d’usine individuels ne se terminent pas par _spec.

5
scarver2

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


Le chargement d'une fille d'usine dans une console de développement remplira également cette fonction:

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

lève un FactoryGirl::DuplicateDefinitionError sur une séquence sous Factory Girl v4.4.0.

Il semble que les séquences soient traitées différemment dans FG et que le simple encapsulation de toutes les séquences dans un bloc de secours résoudra le problème.

Par exemple:

  begin
    sequence :a_sequence do |n|
      n
    end
    sequence :another_sequence do |n|
      n*2
    end
  rescue FactoryGirl::DuplicateDefinitionError => e
    warn "#{e.message}"
  end
2
bbozo

J'ai renommé spec/factories en spec/setup_data et le problème a disparu . Essayez de renommer les spéc/factories en tout ce qui vous convient devrait fonctionner.

1
Pikender Sharma

essayer de courir 

rake db: test: prepare

1
Joao Marcelo

J'ai le même problème. Ce que je fais est de déplacer le spec/factories.rb à spec/factories/role.rb

1
Chamnap

J'ai eu le même problème. Cela se produit parce que vous utilisez une gemme 'refinerycms-testing'? ce qui nécessite factory-girl, alors vous devriez commettre cette gemme, ou gem 'factory_girl_Rails', n'utilisez pas toutes ces gemmes.

    #gem 'refinerycms-testing', '~> 2.0.9', :group => :test
    gem 'factory_girl_Rails', :group => :test

ou

    #gem 'factory_girl_Rails', :group => :test
    gem 'refinerycms-testing', '~> 2.0.9', :group => :test 
1
EdikGataullin

J'ai eu exactement le même problème… .. Il se produit lorsque vous utilisez le générateur d'échafaudage… .. Il crée automatiquement une usine dans test/fabories / Donc, généralement, la suppression de ce fichier résout votre problème

1
user1458963

J'ai eu le même problème, il s'est avéré qu'il existe un users.rb par défaut créé dans le test/factories qui a été créé par la commande Rails g. Ce fichier était à l'origine du conflit. L'erreur a disparu lorsque j'ai supprimé le fichier. 

1
ultrajohn

S'il vous plaît essayez de suivre ces étapes

1) J'ai cherché toutes les occurrences de "factory_girl" dans mon Rails_ROOT:

trouver . -name "* .rb" | xargs grep "factory_girl"

2) Comme il s'agissait d'un "app" de moteur complet que j'ai créé via le "plugin Rails new --mountable", j'avais un fichier sous Rails_ROOT // lib/appelé "engine.rb". Cela a:

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) J'ai également eu les informations suivantes dans mon fichier spec_helper.rb:

Dir ["# {File.dirname (FICHIER)}/factories/* / .rb"]. Each {| f | besoin de f}

4) la ligne g.fixture_replacement dans engine.rb et la ligne Dir dans spec_helper.rb initialisaient les usines à deux reprises. J'ai commenté celui de spec_helper.rb et que corrige le problème

Alternativement, vous pouvez laisser spec_helper.rb et commenter dans engine.rb. 

Les deux ont résolu le problème dans mon cas.

1
guest

J'ai eu le même problème - assurez-vous de ne pas charger FactoryGirl une seconde fois dans votre fichier spec/support/env.rb.

1
mhriess

Vérifiez si vous avez ajouté des usines via le générateur de modèle. Mon générateur a créé un modèle et j'en ai ajouté un à mon fichier principal factory.rb. Supprimer ceux générés automatiquement a fonctionné pour moi.

0
user3179438

J'ai résolu ceci parce que j'essayais de créer deux usines. Ma fonctionnalité a inclus la ligne:

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

Et puis j'ai utilisé une méthode d'assistance sign_up (utilisateur):

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

De retour à ma fonctionnalité, j'ai appelé:

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

...

essayant ainsi efficacement d’inscrire un utilisateur déjà créé par l’usine.

J'ai modifié sign_up(user) en sign_in(user) et l'assistant pour:

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 

maintenant, l'argument user crée l'utilisateur dans la base de données en raison du bloc let! et la fonction sign_up(user) les connecte.

J'espère que cela aide quelqu'un!

oh! et j'ai aussi dû commenter:

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

comme le suggèrent beaucoup d'autres réponses.

0
Joe

J'ai défini la même fabrique de noms sur factories.rb et je viens de constater que quelqu'un d'autre définit la même fabrique sous le répertoire des fabriques. Donc, en fait, je peux simplement l'utiliser sans en définir un autre. 

0
arthur bryant

La chose la plus étrange, j'ai eu cette erreur avec l'erreur de syntaxe suivante dans le code: 

before_validation :generate_reference, :on: :create

:on: était à l'origine de cette erreur. Comment ou pourquoi restera un mystère.

0
Kris

pour moi, ce problème venait parce qu'il utilisait les deux gemmes

gem 'factory_bot_Rails'
gem 'factory_girl_Rails'

pour résoudre j'ai enlevé gem 'factory_bot_Rails' du fichier gem ..__ et ajouté aussi require 'factory_girl' au fichier spec/factories/track.rb.

if Rails.env.test?
    require 'factory_girl'
    FactoryGirl.define do
      factory :track do
            id 1
            name "nurburgring"
            surface_type "snow"
            time_zone "CET"
       end
    end

J'espère que cela aidera.

0
Hitesh Ranaut

J'ai également couru avec le même problème et commenter une seule ligne dans le fichier spec_helper.rb a résolu mon problème. 

Essayez de commenter cette ligne à partir du fichier spec_helper.rb et vous devriez être bon.

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

Je l'ai résolu en supprimant spec/factories/xxx.rb de la ligne de commande:

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

Je viens de découvrir que je recevais cette réponse lorsque j'ai accidentellement appelé cucumber features. Lorsque je viens d'appeler cucumber, le problème a disparu.

0
steven_noble

Remplacez la gemme refinerycms-testing par rspec-Rails et factory_girl_Rails

0
Brooks