問題の説明:-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
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にはrspec
とrpsec-Rails
の両方は必要ありません。両方を次のものに置き換えることができます。
group :development, :test do
gem 'rspec-Rails'
end
Rakeタスクが開発で動作し、コアテストがテストで動作するように、両方のグループにrspecが必要です。
最近同じ問題がありました。私の場合、/ factoriesのファイルの1つは_spec.rbで終わりました(クリエイティブなcpの使用結果)。最初にrspecによって、次に工場として2回ロードされました。
私もこの問題を抱えていました。私の場合、次のように同じコードを持つ2つのファイルがありました。
FactoryGirl.define do
factory :user do
end
end
1つのファイルは「Useres.rb」という名前で、もう1つのファイルは「User.rb」という名前だったので、「Useres.rb」を削除してエラーを修正しました。
これを貼り付ける可能性はありますか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つのブロックのみが必要であることがわかります。私はこの間違いを犯し、質問に記載されているエラーを受け取りました。
この問題がある場合は、FactoryGirl.define(:user)
またはFactoryGirl.find_definitions
を2回呼び出してください。
2番目の呼び出しを削除してみてくださいまたは:
FactoryGirl.factories.clear
FactoryGirl.find_definitions
別の考えられる理由は、FactoryGirl.find_definitions
の予備呼び出しです。 find_definitionsが見つかった場合は削除してください。
個々のファクトリファイルが_spec
で終わっていないことを確認してください。
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
Spec/factoriesの名前をspec/setup_dataに変更すると、問題はなくなりました。仕様/工場の名前を、動作するはずのスイートに変更してみてください。
走ってみる
rake db:test:prepare
私は同じ問題を抱えています。私がやっていることは、spec/factories.rbをspec/factories/role.rbに移動することです
同じ問題がありました。これは、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
私はまったく同じ問題を抱えていました。スキャフォールドジェネレーターを使用すると発生します。 test/factories /にファクトリが自動的に作成されるため、一般的にこのファイルを削除するだけで問題が解決します
同じ問題がありました。users.rb
コマンドで作成されたtest/factories
内に作成されたデフォルトのRails g
がありました。このファイルが競合を引き起こしていました。ファイルを削除するとエラーは消えました。
次の手順に従ってください
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にコメントアウトすることもできます。
私の場合、両方とも問題を修正しました。
私も同じ問題を抱えていました。spec/ support/env.rbファイルでFactoryGirlをもう一度ロードしないようにしてください。
モデルジェネレーターでファクトリを追加したかどうかを確認します。ジェネレーターがモデルを作成し、メインのfactory.rbファイルに追加しました。自動生成されたものを削除することは私のために働いた。
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 }
_
他の多くの答えが示唆するように。
Factories.rbで同じ名前のファクトリを定義しましたが、他の誰かがファクトリのディレクトリの下で同じファクトリを定義していることがわかりました。だから、実際に私は別のものを定義せずにそれを使うことができます。
最も奇妙なことは、コードに次の構文エラーが含まれていることです。
before_validation :generate_reference, :on: :create
:on:
がこのエラーの原因でした。どのように、またはなぜ謎が残るのか。
私にとっては、両方の宝石を使用していたため、この問題が発生していました
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
これが役立つことを願っています。
私も同じ問題で走り、spec_helper.rbファイルの1行をコメントアウトして問題を解決しました。
Spec_helper.rbファイルからこの行をコメントアウトしてみてください。
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
コマンドラインからspec/factories/xxx.rb
を削除して解決しました:
rspec spec/factories/xxx.rb spec/model/xxx.rb # before
rspec spec/model/xxx.rb # after
誤ってcucumber features
。 cucumber
を呼び出したところ、問題はなくなりました。
Refinerycms-testing gemをrspec-Railsとfactory_girl_Railsに置き換えます
私の場合、
まず、同僚がfactory_girl
gemでプロジェクトをセットアップしました
Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }
Rails_helper
で。
数日後、gemをfactory_girl_Rails
に置き換えました。この新しいgemも内部でそれを行うため、工場は2回登録されました。これがエラーの原因でした。
Rails_helper
からその行を削除し、機能しました。