error codes & solutions

FactoryGirl::DuplicateDefinitionError

errors_eyecatch

どうも、鹿せんべいです。

アイキャッチ画像はエラーが発生した時のイライラを軽減するため、猫です。

今回はターミナル上で、

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