factory_botとは?
factory_botは、Rubyのテスト用オブジェクトを生成するライブラリです。

GitHub - thoughtbot/factory_bot: A library for setting up Ruby objects as test data.
A library for setting up Ruby objects as test data. - thoughtbot/factory_bot
Ruby on Railsでも利用できますし、ピュアなRubyプロジェクトでも利用できます。また様々なテストフレームワークにも対応しています。
今回導入するのは、アプリケーションフレームワークはRuby on Railsで、テストフレームワークはRspecです。他の環境への導入方法は、GETTING_STARTEDにも記載があります。
factory_botのインストール
まずはgemを導入します。
gem 'factory_bot_rails'
bundle install
あとは設定として、rspec_helperに以下の1行を追加するだけです。
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
# ...
end
これで準備は完了です。
Rspecで利用する
テストで使うオブジェクトを定義します。
spec/factories/users.rb に以下のようにテストオブジェクトを定義します。静的な値で定義することもできますし、オブジェクト生成ごとにユニークな属性を設定することもできます。GETTING_STARTEDを見ると、柔軟な設定ができることがわかります。
FactoryBot.define do
factory :user, class: 'User' do
sequence(:id) { |n| n }
name { 'Naoyuki Kataoka' }
# ...
created_at { Time.current }
updated_at { Time.current }
end
end
定義したオブジェクトは、buildメソッドで呼び出しことができます。factory_botによって生成されたオブジェクトを使ってテストを書いてみます。
RSpec.describe User, type: :model do
let(:user) { build(:user) }
it 'has a valid factory for User' do
expect(user).to be_valid
end
end
Factory not registeredエラーの対処
導入の途中で、Factory not registeredというエラーが発生しました。
Factory not registered: "user"
ドキュメントを読み直して気づきましたが、Ruby on Railsで利用する場合は、factory_botではなく、factory_bot_railsのgemを利用する必要があります。
gem 'factory_bot'
これで正常に動作することができました。