0
0

More than 3 years have passed since last update.

しょうもなすぎるミスでFactoryGirl::DuplicateDefinitionErrorしていた話。

Posted at

RspecとFactoryGirlを用いたテストを実行しているときにハマったエラーがしょうもなすぎたのでここにアウトプットしていく。

発生したエラー

FactoryGirlを用いて定義したuserが他で定義していなにもかかわらず、FactoryGirl::DuplicateDefinitionErrorという重複のエラーになった。

spec/factories/users.rb
FactoryGirl.define do
    factory :user do
        name { Faker::Lorem.word }
        number { Faker::Number.number(10) }
    end
end
spec/requests/users_request_spec.rb
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_railsfactory_girl_railsがインストールされている。

これは当たり前すぎる重複。。。。

すぐさまfactory_bot_railsを消してbundle install

これでエラーが解消した。

結論:エラー文ちゃんと読もう

エラーが出たらすぐにググる癖がついていたことがほんとによくないなって思った。

ググることがよくないことではなく、エラーにちゃんと向き合いながらしょうもなすぎるケアレスミスをなくすところが今後も大切だなって感じさせてくれた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0