web-dev-qa-db-ja.com

ファクトリーは既に登録済みです:ユーザー(FactoryGirl :: DuplicateDefinitionError)

問題の説明:-factory_girl_Railsをセットアップしましたが、ファクトリをロードしようとするたびに、複数回ロードしようとしています。

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 [〜#〜]:ここに私の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
43
user1212241

Gemファイルではなくfactory_girl_Railsにgem spec_helper.rbが必要です-FactoryGirlを2回必要としている可能性があり、これが重複している理由です。

Gemファイルでこれを試してください。

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

次に、次のコマンドを使用してspec_helperにファクトリーガールが必要であることを確認します。

require 'factory_girl_Rails'

ちなみに、gemfileにはrspecrpsec-Railsの両方は必要ありません。両方を次のものに置き換えることができます。

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

Rakeタスクが開発で動作し、コアテストがテストで動作するように、両方のグループにrspecが必要です。

36
nmott

最近同じ問題がありました。私の場合、/ factoriesのファイルの1つは_spec.rbで終わりました(クリエイティブなcpの使用結果)。最初にrspecによって、次に工場として2回ロードされました。

22

私もこの問題を抱えていました。私の場合、次のように同じコードを持つ2つのファイルがありました。

FactoryGirl.define do
  factory :user do
  end
end

1つのファイルは「Useres.rb」という名前で、もう1つのファイルは「User.rb」という名前だったので、「Useres.rb」を削除してエラーを修正しました。

16
Eduardo Leal

これを貼り付ける可能性はありますかwhole構成ドキュメントのサポートファイルのスニペットですか?

# 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

コメントを読むと、1つのブロックのみが必要であることがわかります。私はこの間違いを犯し、質問に記載されているエラーを受け取りました。

16
Ryan Bosinger

この問題がある場合は、FactoryGirl.define(:user)またはFactoryGirl.find_definitionsを2回呼び出してください。

2番目の呼び出しを削除してみてくださいまたは:

FactoryGirl.factories.clear
FactoryGirl.find_definitions  
10
Moriarty

別の考えられる理由は、FactoryGirl.find_definitionsの予備呼び出しです。 find_definitionsが見つかった場合は削除してください。

9

個々のファクトリファイルが_specで終わっていないことを確認してください。

5
scarver2

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


ファクトリーガールを開発コンソールにロードすると、これも実行されます。

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

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
2
bbozo

Spec/factoriesの名前をspec/setup_dataに変更すると、問題はなくなりました。仕様/工場の名前を、動作するはずのスイートに変更してみてください。

1
Pikender Sharma

走ってみる

rake db:test:prepare

1
Joao Marcelo

私は同じ問題を抱えています。私がやっていることは、spec/factories.rbをspec/factories/role.rbに移動することです

1
Chamnap

同じ問題がありました。これは、gem「refinerycms-testing」を使用しているために発生しますか? factory-girlが必要なので、このgemをコミットするか、gem 'factory_girl_Rails'をコミットする必要があります。このgemをすべて使用しないでください。

    #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 
1
EdikGataullin

私はまったく同じ問題を抱えていました。スキャフォールドジェネレーターを使用すると発生します。 test/factories /にファクトリが自動的に作成されるため、一般的にこのファイルを削除するだけで問題が解決します

1
user1458963

同じ問題がありました。users.rbコマンドで作成されたtest/factories内に作成されたデフォルトのRails gがありました。このファイルが競合を引き起こしていました。ファイルを削除するとエラーは消えました。

1
ultrajohn

次の手順に従ってください

1)Rails_ROOTから「factory_girl」のすべての出現を探しました。

見つける。 -name "* .rb" | xargs grep "factory_girl"

2)これは「Rails plugin new --mountable」で作成した完全なエンジンプラグイン「アプリ」であったため、「engine.rb」というファイルがRails_ROOT // lib /の下にありました。持っていた:

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 [〜#〜])}/factories/*/。rb "]。each {| f | fが必要です}

4)engine.rbのg.fixture_replacement行とspec_helper.rbのDir行は、ファクトリーを2回初期化していました。 spec_helper.rbからコメントアウトしました問題を修正しました

または、spec_helper.rbに残してengine.rbにコメントアウトすることもできます。

私の場合、両方とも問題を修正しました。

1
guest

私も同じ問題を抱えていました。spec/ support/env.rbファイルでFactoryGirlをもう一度ロードしないようにしてください。

1
mhriess

モデルジェネレーターでファクトリを追加したかどうかを確認します。ジェネレーターがモデルを作成し、メインのfactory.rbファイルに追加しました。自動生成されたものを削除することは私のために働いた。

0
user3179438

2つの工場を作ろうとしていたので、これを解決しました。私の機能仕様には次の行が含まれていました:

_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

...
_

したがって、ファクトリーによってすでに作成されていたユーザーを効果的にサインアップしようとします。

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引数は_let!_ブロックのためにdbにUserを作成し、sign_up(user)がそれらをログインさせます。

これが誰かを助けることを願っています!

ああ!また、コメントアウトする必要がありました。

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

他の多くの答えが示唆するように。

0
Joe

Factories.rbで同じ名前のファクトリを定義しましたが、他の誰かがファクトリのディレクトリの下で同じファクトリを定義していることがわかりました。だから、実際に私は別のものを定義せずにそれを使うことができます。

0
arthur bryant

最も奇妙なことは、コードに次の構文エラーが含まれていることです。

before_validation :generate_reference, :on: :create

:on:がこのエラーの原因でした。どのように、またはなぜ謎が残るのか。

0
Kris

私にとっては、両方の宝石を使用していたため、この問題が発生していました

gem 'factory_bot_Rails'
gem 'factory_girl_Rails'

解決するために、gem 'factory_bot_Rails'をgemファイルから削除しました。また、require 'factory_girl'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

これが役立つことを願っています。

0
Hitesh Ranaut

私も同じ問題で走り、spec_helper.rbファイルの1行をコメントアウトして問題を解決しました。

Spec_helper.rbファイルからこの行をコメントアウトしてみてください。

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

コマンドラインからspec/factories/xxx.rbを削除して解決しました:

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

誤ってcucumber featurescucumberを呼び出したところ、問題はなくなりました。

0
steven_noble

Refinerycms-testing gemをrspec-Railsとfactory_girl_Railsに置き換えます

0
Brooks

私の場合、

まず、同僚がfactory_girl gemでプロジェクトをセットアップしました

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

Rails_helperで。

数日後、gemをfactory_girl_Railsに置き換えました。この新しいgemも内部でそれを行うため、工場は2回登録されました。これがエラーの原因でした。

Rails_helperからその行を削除し、機能しました。

0
illusionist