FactoryGirl::DuplicateDefinitionError
目次
前提条件
Precondition
version
$ruby -v
ruby 2.5.1
$ rails -v
Rails 5.2.1
group :development, :test do
gem 'factory_girl_rails', "~> 4.4.1"
end
状況situation
テスト環境下で作業しており、改めて開発環境を立ち上げようとして、 ターミナルで$ rails sを実行したところ
method_missing': Factory already registered: tweet (FactoryGirl::DuplicateDefinitionError)
のエラーが発生。 エラー文を読み解くと、既にtweetが登録されているよ、ということを告げていますね。
原因cause
おそらくspec/factoriesのフォルダに◯◯.rbというファイルを作成していると思います。
ex:)
FactoryGirl.define do
factory :tweet do
text "hello!"
user_id 1
end
end
私の場合は、tweets.rbというファイルにtweetをdefineしていました。
このfactoriesで定義した名前空間はグローバルglobalなので、 ターミナル上で$ rspec 〜 というコマンド以外の $ rails s $ rails c $ rake 〜 などのコマンドにも干渉してくる(らしい)。
rspecのコマンドを入力した時にだけ関係あるのかと思っていました。
解決方法Solution
# FactoryGirl.define do
# factory :tweet do
# text "hello!"
# user_id 1
# end
# end
コメントアウトや削除したら、動作しました。
Conclusion
- factoryGirlの名前空間はグローバル
- spec/factories/◯◯.rbでdefineされているのが原因
- defineされている部分を消しちゃう