RspecとFactoryGirlを用いたテストを実行しているときにハマったエラーがしょうもなすぎたのでここにアウトプットしていく。
発生したエラー
FactoryGirlを用いて定義したuser
が他で定義していなにもかかわらず、FactoryGirl::DuplicateDefinitionError
という重複のエラーになった。
FactoryGirl.define do
factory :user do
name { Faker::Lorem.word }
number { Faker::Number.number(10) }
end
end
require 'rails_helper'
RSpec.describe "Users", type: :request do
let!(:users) { create_list(:user, 10) }
let(:user_id) { users.first.id }
# ・・・・・・・・・
end
Failure/Error:
factory :user do
title { Faker::Lorem.word }
number { Faker::Number.number(10) }
end
FactoryGirl::DuplicateDefinitionError:
Factory already registered: user
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/decorator.rb:10:in `method_missing'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/decorator/disallows_duplicates_registry.rb:6:in `register'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl.rb:94:in `block in register_factory'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl.rb:93:in `each'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl.rb:93:in `register_factory'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:20:in `factory'
# ./spec/factories/todos.rb:2:in `block in <main>'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:49:in `instance_eval'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:49:in `run'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:7:in `define'
いろんな記事を参照
自己解決が難しかったからとりあえずググる。
https://qiita.com/yukiyoshimura/items/ca60a712fb705cf9bf89
https://qiita.com/uriuribobo/items/0df452eed8ce651c1642
https://easyramble.com/factory-girl-duplicate-definition-error.html
https://shikasen-engineer.com/error_factorygirl/
https://codenote.net/ruby/rails/1640.html
このあたりの記事などを中心に参考にしていましたが、ほとんどの場合はファイル名の間違えや全検索して重複を確かめるなどのケアレスミスや重複の問題解決で、ここに関しては何度もチェックして正しくできていることが確認できていた。
ではどこのエラーなのか。。。。。。
もエラー内容を再度確認
Failure/Error:
factory :user do
title { Faker::Lorem.word }
number { Faker::Number.number(10) }
end
FactoryGirl::DuplicateDefinitionError:
Factory already registered: user
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/decorator.rb:10:in `method_missing'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/decorator/disallows_duplicates_registry.rb:6:in `register'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl.rb:94:in `block in register_factory'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl.rb:93:in `each'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl.rb:93:in `register_factory'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:20:in `factory'
# ./spec/factories/todos.rb:2:in `block in <main>'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:49:in `instance_eval'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:49:in `run'
# /usr/local/bundle/gems/factory_girl-4.9.0/lib/factory_girl/syntax/default.rb:7:in `define'
FactoryGirl::DuplicateDefinitionError:
は重複しているということを伝えるエラーだから、重複するパータンについて広い意味で考えてみた。
- 他のファイルで
user
が定義されていて重複 -
spec
ディレクトリだけでなくtest
ディレクトリ内でも同様にFactoryGirlでuser
が定義されていて重複 - FactoryGirlのパッケージ自体が
test
環境内で2回インストールされていて重複
これらが出てきたからひとつずつ確認していった。
他のファイルで
user
が定義されていて重複
これについては、何度も確認していることなので確認済み。
spec
ディレクトリだけでなくtest
ディレクトリ内でも同様にFactoryGirlでuser
が定義されていて重複
試しにtest
ディレクトリ削除してもう一度確認してもエラーは解消せず。。。。
戻してひとつずつ確認しても重複が見つからなかった。
FactoryGirlのパッケージ自体が
test
環境内で2回インストールされていて重複
Gemflie
を確認すると、
# ・・・・
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
# ・・・・
group :test do
gem 'factory_girl_rails'
gem 'shoulda-matchers'
gem 'faker'
gem 'database_cleaner'
end
# ・・・・
test
環境にfactory_bot_rails
とfactory_girl_rails
がインストールされている。
これは当たり前すぎる重複。。。。
すぐさまfactory_bot_rails
を消してbundle install
これでエラーが解消した。
結論:エラー文ちゃんと読もう
エラーが出たらすぐにググる癖がついていたことがほんとによくないなって思った。
ググることがよくないことではなく、エラーにちゃんと向き合いながらしょうもなすぎるケアレスミスをなくすところが今後も大切だなって感じさせてくれた。