🚀

FactoryBot.create(:user)をcreate(:user)と書けるようにする

2022/11/14に公開

RspecとFactoryBotのセットアップ時にどうするんだっけ?と忘れてしまうことがあるので備忘録です。

やりたいこと

specを書くときにテストデータをFactoryBot.create(:user)と毎回書くのは辛いので
create(:user)でデータを作成したい

前提

spec/rails_helper.rbの以下行のコメントアウトをはずし、spec実行時にsupportフォルダを読み込む設定にします。rails_helper.rbにいろんな設定を書いていくと見通しが悪くなるので、必要に応じてsupportフォルダを活用するのが良いし、ほとんどのプロジェクトで設定しているはず。

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

rspecとfactorybotのgemをインストールしておく

group :development, :test do
  gem "rspec-rails"
  gem "factory_bot_rails"
end

この順番が逆だとbin/rails g factory_bot:model *を実行すると
spec/factories/*.rbではなく、test/factories/*.rbにファイルが作成されることがあるみたいなので、うまくいかない場合はgem uninstallコマンド一度実行し、上記のgemをアンインストールしてから再度bundle installし直してみてください。 issueが上がっていたのでこちらも参考にしてください。

本題

FactoryBot.create(:user)をcreate(:user)と書けるように設定していきます。
何も設定していない状態でspecファイルにcreate(:user)と書くと以下のようにErrorがRaiseされます。

NoMethodError:
  undefined method `create' for #<RSpec::ExampleGroups::Users:0x00007f855be473d8>

以下のsuportフォルダ配下にfactory_bot.rbを作成し以下の設定を記述します。
/spec/support/factory_bot.rb

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

これでFactoryBot.create(:user)をcreate(:user)と書けるようなりました!

FactoryBotのGitHubにセットアップやベストプラクティスについて書いてあるので一読するとより良いテストデータが作成できるようになるかと思います!
ついつい経験から思い出しながらやると抜けてしまうことも多々あるのでちゃんとドキュメントを参照しましょう。(自戒)
リンクを貼っておきます。
https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#rspec

Discussion