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
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.
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.
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.
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.
Une autre raison possible est l’appel de secours de FactoryGirl.find_definitions
. Essayez de supprimer find_definitions s’il est trouvé.
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
Assurez-vous que vos fichiers d’usine individuels ne se terminent pas par _spec
.
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
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.
essayer de courir
rake db: test: prepare
J'ai le même problème. Ce que je fais est de déplacer le spec/factories.rb à spec/factories/role.rb
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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}
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
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.
Remplacez la gemme refinerycms-testing par rspec-Rails et factory_girl_Rails