KeyError: Factory not registered:のエラーが出た件【FactoryBot】
FactoryBotとは。
https://github.com/thoughtbot/factory_bot_rails/blob/master/README.md
テストコードを書く時に、予め各クラスのインスタンスの値を設定しておいて
テストコードから呼び出せる仕組み。
railsのユーザー登録の設定だったら、FactoryBotのGemをインストールした上で
spec/factories/users.rb
FactoryBot.define do factory :user do name {"testname"} email {"test@test.com"} password {"test1234"} end end
こんな感じで設定しておけば、テストコードでそのレコードを呼び出せる。
FactoryBot.build(:user)
Newじゃなくてbuildを使う。
よくわからないエラーが現れる【KeyError】
今回は上記のとおりFactoryBotの値を設定してとりあえずコンソールで呼び出してみた。
[1] pry(main)> FactoryBot.build(:user)
そしたら謎のエラーが…
KeyError: Factory not registered: "user" from /Users/home/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/hash_with_indifferent_access.rb:191:in `fetch' Caused by KeyError: key not found: "user" from /Users/home/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/hash_with_indifferent_access.rb:191:in `fetch'
エラーメッセージを読んでみてもよくわからない。KeyErrorって初めて見たし…
まずは各ファイル内にいつものタイポや記述ミスが無いか目を凝らして確認したが、
合っていそうな感じ。
ということは私の人為的ミスではなく、手の及んでいない裏方でなにかあるのかも?と思い
コンソールの再起動をしたりしてみたけれどうまく行かず。
見たことあるエラーだったらなんとなくあたりをつけて探れるけど、
どうにもこうにも行かないのでエラーメッセージでググってみた。
解決:spring stop
以下参考にさせていただきました。
masawada.hatenablog.jpqiita.com
なんじゃspringって??
Spring is a Rails application preloader. It speeds up development by keeping your application running in the background so you don't need to boot it every time you run a test, rake task or migration.
引用元:https://github.com/rails/spring
アプリを常にバックグラウンドで走らせておいて、
いちいち起動しなくて済むから速いぜみたいな感じのやつかな。
結局このエラーが出たときも、なあーんにも考えず教材用アプリをクローンしてきただけなので
springが入ってるかどうかとかも知らなかった。
入ってた。
一旦コンソールを抜け出して、以下コマンドを試す。
% spring stop Spring stopped.
止まった。動いてたのも知らなかったやつ止めた。
この状態でコンソールをもう一度起動する。
% rails c Running via Spring preloader in process 32415 Loading development environment (Rails 6.0.3.2) [1] pry(main)>
あれ??springも再起動しちゃってない??
(後で調べたらstopしたspringはrailsコマンドを使うと再起動するらしい)
まいいや。もう一度FactoryBotをbuildする。
[1] pry(main)> FactoryBot.build(:user) (14.6ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 => #<User id: nil, email: "test@test.com", created_at: nil, updated_at: nil, name: "testname">
うわーんできた。めっちゃ安心した。ドツボにはまるかと思った。
springのせいでrailsのコマンドとかが動かないってたまにあるみたい。
自分のコードが間違っているならまだ解決方法はあるとして、
こういうふうに全く予見できないエラーとか起きると初見だとほんとに詰む。
とはいえスーパー初心者の自分が遭遇するようなエラーって
だいたいいろんな人が経験しているはずで
今まで同じエラーで苦しんだ方々の解決法が調べれば出てくるはずなので
調べる力も大事、かついろんなエラーに遭遇しておくのも大事。
そしてこんな感じで蓄積しておくのも大事。