FactoryGirl::DuplicateDefinitionError

どうも

今回はターミナル上で、

method_missing': Factory already registered: tweet (FactoryGirl::DuplicateDefinitionError)

というエラーが発生しました。

"tweet"の部分は人によって異なるかと思われます。

それでは原因と解決方法を見ていきましょう。

前提条件

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されている部分を消しちゃう