FactoryBot使用でエラー。KeyError: Factory not registered:
先日FactoryBotを使用したらエラーが出てしばらく困ったので、その時のことを記録しておこうかと思います。
FactoryBot使用の準備
FactoryBotを使用するための準備をします。
まずはgemfileに必要なgemを記載していきます。
group :development, :test do # 中略 gem 'rspec-rails' gem 'factory_bot_rails' gem 'faker' end
ターミナルでコマンドを実行し、gemをインストールします。
% bundle install % rails g rspec:install
テスト実行後のフォーマットを変更するため、.rspec
ファイルに以下の記述を追加します。
--format documentation
ここまででFactoryBot使用の準備は完了です。続いて、FactoryBotの記述を指定いきます。
FactoryBotファイルの作成
まずはspecディレクトリにfactoriesディレクトリを作成し、その中にuser.rb
というファイルを作成します。
今回FactoryBotで作ろうとしていた値が下の通りです。
FactoryBot.define do factory :user do name {Faker::Name.last_name} email {Faker::Internet.free_email} password = Faker::Internet.password(min_length: 8) password {password} password_confirmation {password} end end
FactoryBotで値を生成してみる
FactoryBotで正しく値が生成できるか、コンソールを使って試してみました。
% rails c pry(main)> FactoryBot.create(:user)
その結果がこちら。
KeyError: Factory not registered: "user" だと…?間違いなくuserのFactoryBotを作成したはず…。
解決策①
色々と検索して調べてみると、同じようなエラーに陥った人がちらほらいるらしい。そしてみなさん、springが原因だったらしく、spec/spec_helper.rb
内に以下の記述を加えることで解決したらしい。
RSpec.configure do |config| config.before(:all) do FactoryBot.reload end end
早速試してみましたが、私の場合解決されず…。
解決策②
メンターさんに相談してみたら、ターミナルで以下のコマンドを実行してみるようにと。springをいったん停止して再起動するということらしい。
% spring stop
そうしたら、動きました!無事に架空のuserさんが生成されました。
やっぱりspringが原因だったみたいです。時々springのせいでうまく動かないことがあるらしいので、Railsを使っていて困ったら、spring stop
を試してみてもいいかもしれません。
springとは
springは、アプリケーションをバックグラウンドで動かし続けておくことで、railsコマンドの実行が素早く行える機能です。アプリケーションプリローダー(preloader)というらしいです。
まとめ
- railsで困ったときは
spring stop
を試すといいかもしれない - 一人で悩んでたら永遠にわからなかった。困ったときに相談できる相手がいるのは重要