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

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_rails`と`factory_girl_rails`がインストールされている。

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

すぐさま`factory_bot_rails`を消して`bundle install`

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

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

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

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