Railsプロジェクトにfactory_botの導入

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. - GitHub - thoughtbot/factory_bot: A library for setting up Ruby objects as test data.

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'

これで正常に動作することができました。

タイトルとURLをコピーしました