web-dev-qa-db-de.com

Factory ist bereits registriert: user (FactoryGirl :: DuplicateDefinitionError)

Beschreibung des Problems: - Ich habe factory_girl_Rails eingerichtet. Wenn ich jedoch versuche, eine Factory zu laden, wird versucht, sie mehrmals zu laden.

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

Die einzige andere Sache, die ich geändert habe, ist: /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

Dies scheint ein Kompatibilitäts-/Umgebungsproblem zu sein, das ich scheinbar nicht herausfinden kann. Irgendwelche Vorschläge?

EDIT: hier ist meine 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

Der gem factory_girl_Rails sollte im spec_helper.rb und nicht in der gemfile erforderlich sein. Möglicherweise benötigen Sie FactoryGirl zweimal, weshalb Sie das Duplikat erhalten.

Versuchen Sie dies in Ihrer Gem-Datei:

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

Stellen Sie dann sicher, dass Factory Girl im spec_helper benötigt wird:

require 'factory_girl_Rails'

Übrigens - Sie benötigen nicht beide rspec und rpsec-Rails in Ihrem Gemfile. Sie können beide durch Folgendes ersetzen:

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

Sie benötigen rspec in beiden Gruppen, damit die Rake-Aufgaben in der Entwicklung und die Kerntests im Test funktionieren.

36
nmott

Ich hatte kürzlich das gleiche Problem. In meinem Fall hatte eine der Dateien in/factories die Endung _spec.rb (Ergebnis der kreativen Verwendung von cp). Es wurde zweimal geladen, zuerst von rspec und dann als Fabrik.

21

Ich hatte auch dieses Problem. In meinem Fall gab es zwei Dateien mit demselben Code wie folgt:

FactoryGirl.define do
  factory :user do
  end
end

Eine Datei hatte den Namen "Useres.rb" und die andere "User.rb", also habe ich "Useres.rb" gelöscht und den Fehler behoben.

15
Eduardo Leal

Gibt es eine Chance, dass Sie dieses ganze snippet für die Unterstützungsdatei aus den Konfigurationsdokumenten eingefügt haben?

# 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

Wenn Sie die Kommentare lesen, möchten Sie, dass Sie nur den einen oder den anderen Block benötigen. Ich habe diesen Fehler gemacht und den in der Frage angegebenen Fehler erhalten.

14
Ryan Bosinger

Ein anderer möglicher Grund ist der Ersatzaufruf von FactoryGirl.find_definitions. Versuchen Sie, find_definitions zu entfernen, falls gefunden.

9

Rufen Sie zweimal FactoryGirl.define(:user) oder FactoryGirl.find_definitions auf. Sie haben auch dieses Problem. 

Versuchen Sie, den zweiten Anruf zu entfernen oder:

FactoryGirl.factories.clear
FactoryGirl.find_definitions  
9
Moriarty

Stellen Sie sicher, dass Ihre individuellen Factory-Dateien nicht mit _spec enden.

5
scarver2

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


Das Laden von Factory Girl in eine Entwicklungskonsole erledigt dies ebenfalls:

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

wird einen FactoryGirl::DuplicateDefinitionError in einer Sequenz unter Factory Girl v4.4.0 erzeugen.

Es scheint, als würden die Sequenzen innerhalb von FG unterschiedlich gehandhabt. Wenn Sie alle Sequenzen in einen Rettungsblock packen, wird das Problem gelöst.

Zum Beispiel:

  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

Ich habe spec/factories in spec/setup_data umbenannt, und das Problem ist verschwunden

1
Pikender Sharma

versuche zu rennen 

rechen db: test: vorbereiten

1
Joao Marcelo

Ich habe das gleiche Problem. Was ich mache, ist, die spec/factories.rb auf spec/factories/role.rb zu verschieben

1
Chamnap

Ich hatte das gleiche Problem. Dies geschieht, weil Sie Edelstein-Raffinerietests verwenden? Für das Fabrik-Mädchen ist ein Schmuckstück erforderlich, also sollten Sie diesen Edelstein begehen oder den Edelstein 'factory_girl_Rails' begehen.

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

oder

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

Ich hatte genau das gleiche Problem ... _. Es tritt auf, wenn Sie den Scaffold-Generator verwenden. _. Es erstellt automatisch eine Factory in test/factories /.__

1
user1458963

Ich hatte das gleiche Problem, es stellte sich heraus, dass ein Standard users.rb Innerhalb des Befehls test/factories Erstellt wurde, der mit dem Befehl Rails g Erstellt wurde. Diese Datei hat den Konflikt verursacht. Der Fehler verschwand, als ich die Datei löschte.

1
ultrajohn

Bitte folgen Sie diesen Schritten

1) Ich habe alle Vorkommen von "factory_girl" in meinem Rails_ROOT gesucht:

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

2) Da dies eine vollständige Engine-Plugin-App war, die ich über "Rails-Plugin neu --mountable" erstellt hatte, hatte ich eine Datei unter Rails_ROOT // lib/namens "engine.rb". Es hatte:

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) Ich hatte auch Folgendes in meiner Datei spec_helper.rb:

Dir ["# {File.dirname (FILE)}/factories/* / .rb"]. Jeweils {| f | erfordern f

4) Die g.fixture_replacement-Zeile in engine.rb und die Dir-Zeile in spec_helper.rb initialisierten die Fabriken zweimal. Ich habe die aus spec_helper.rb auskommentiert und das Problem behoben. 

Alternativ können Sie auch in spec_helper.rb und in engine.rb auskommentieren. 

Beide haben das Problem in meinem Fall behoben.

1
guest

Ich hatte das gleiche Problem - stellen Sie sicher, dass Sie FactoryGirl nicht ein zweites Mal in Ihrer Datei spec/support/env.rb laden.

1
mhriess

Prüfen Sie, ob Sie über den Modellgenerator Fabriken hinzugefügt haben. Mein Generator hat ein Modell erstellt und ich fügte eines meiner Hauptdatei factory.rb hinzu. Das Löschen der automatisch generierten löste für mich.

0
user3179438

Ich habe dieses Problem gelöst, weil ich versuchte, zwei Fabriken zu gründen. Meine Feature-Spezifikation umfasste die Zeile:

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

Und dann habe ich eine Hilfemethode sign_up (user) verwendet:

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

Zurück zu meinen Features, rief ich an:

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

...

dadurch wird effektiv versucht, einen Benutzer anzumelden, der bereits von der Fabrik erstellt wurde.

Ich änderte die sign_up(user) zu sign_in(user) und den Helfer zu:

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 

jetzt erstellt das Argument user den Benutzer in der Datenbank aufgrund des let!-Blocks, und die sign_up(user) meldet sie an.

Hoffe das hilft jemandem!

oh! und ich musste auch auskommentieren:

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

wie viele andere Antworten vermuten lassen.

0
Joe

Ich habe die gleiche Namensfabrik in factories.rb definiert, und ich habe gerade festgestellt, dass jemand anderes dieselbe Fabrik unterhalb des Verzeichnisses der Fabriken definiert. Also kann ich es einfach verwenden, ohne ein anderes zu definieren. 

0
arthur bryant

Das seltsamste, ich habe diesen Fehler mit dem folgenden Syntaxfehler im Code erhalten: 

before_validation :generate_reference, :on: :create

:on: hat diesen Fehler verursacht. Wie oder warum bleibt ein Rätsel.

0
Kris

für mich kam diese Ausgabe, weil beide Edelsteine ​​verwendet wurden

gem 'factory_bot_Rails'
gem 'factory_girl_Rails'

um zu lösen, entfernte ich gem 'factory_bot_Rails' aus der gem-Datei . und fügte require 'factory_girl' zur spec/factories/track.rb-Datei hinzu.

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

Ich hoffe das wird helfen.

0
Hitesh Ranaut

Ich lief auch mit dem gleichen Problem und das Auskommentieren einer einzelnen Zeile in der Datei spec_helper.rb löste mein Problem. 

Versuchen Sie, diese Zeile aus der Datei spec_helper.rb zu kommentieren, und Sie sollten gut sein.

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

Ich habe es gelöst, indem ich spec/factories/xxx.rb von der Kommandozeile entfernte:

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

Ich fand gerade diese Antwort, als ich versehentlich cucumber features anrief. Als ich gerade cucumber anrief, ging das Problem weg.

0
steven_noble

Ersetzen Sie den Refinerycms-Tested Gem durch rspec-Rails und factory_girl_Rails

0
Brooks

In meinem Fall,

Zuerst hat mein Kollege das Projekt mit factory_girl Edelstein mit

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

im Rails_helper.

Nach einigen Tagen ersetzte ich den Edelstein durch factory_girl_Rails. Da dieser neue Edelstein das auch intern macht, wurden Fabriken zweimal registriert. Dies verursachte den Fehler.

Entfernte diese Zeile aus Rails_helper und es hat funktioniert.

0
illusionist