FactoryBot使用でエラー。KeyError: Factory not registered:

f:id:endoakak:20200725103757j:plain

先日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)

その結果がこちら。

f:id:endoakak:20200721091527p:plain

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を試すといいかもしれない
  • 一人で悩んでたら永遠にわからなかった。困ったときに相談できる相手がいるのは重要