7
1

FactoryBotの基本的な使い方

Last updated at Posted at 2024-08-05

はじめに

こんにちは!
社会人一年目の石川です。
記事をご覧いただきありがとうございます。

現在、私はRSpecを使ってモデルのテストコードを書いています。その際にFactoryBotを活用しているため使い方をまとめます。

目次

  1. FactoryBotとは?
  2. Gemfileの設定
  3. FactoryBotの設定
  4. 基本メソッドの使用
    buildメソッド
    createメソッド
  5. モデルのテストコード
  6. 最後に

FactoryBotとは?

FactoryBotは、テスト用のデータを簡単に作成するためのライブラリです。テストケースごとにデータを手動で作成するのは面倒ですが、FactoryBotを使うことで、再利用可能なテンプレートを使って効率的にデータを生成できます。

メリット

・テストデータを簡単に生成でき、コードが簡潔に保たれる。
・デフォルト属性を設定し、必要に応じてカスタマイズ可能。
・データ生成方法が統一され、テストの整合性が保たれる。
・可読性が向上する。

Gemfileの設定

まず、GemfileにFactoryBotとRSpecを追加します。これにより、テスト環境でこれらのライブラリが利用可能になります。

group :development, :test do
  gem 'rspec-rails'     # RSpecをRailsプロジェクトで使えるようにする
  gem 'factory_bot_rails' # FactoryBotをRailsプロジェクトで使えるようにする
end

設定後、ターミナルでbundle installを実行して、これらのgemをインストールします。

FactoryBotの設定

FactoryBotを使うためには、テスト用のファクトリファイルを設定する必要があります。ファクトリファイルは、テストで使用するデータのテンプレートを定義します。

ファクトリファイルの作成

spec/factoriesディレクトリにファイルを作成します。例えば、ユーザーモデルのファクトリファイルを spec/factories/users.rbとします。

FactoryBot.define do
  factory :user do
    # デフォルトの属性値を定義
    nickname { "TEST" }
    email { "test@example.com" }
  end
end

FactoryBotの記法の省略

rails_helper.rbに設定を追加することで、FactoryBotのメソッドを簡単に使えるようにします。

RSpec.configure do |config|
  # FactoryBotのメソッドを直接使えるようにする設定
  config.include FactoryBot::Syntax::Methods
end

この設定により、FactoryBot.create(:user)を単に create(:user)と書けるようになります。

基本メソッドの使用

buildメソッド

build メソッドを使うと、指定したファクトリに基づいたオブジェクトを生成しますが、データベースには保存されません。

# factory_botを利用しない場合
user = User.new(nickname: "TEST", email: "test@example.com")

# factory_botを利用する場合
user = build(:user)

createメソッド

create メソッドを使うと、ファクトリに基づいたオブジェクトを生成し、データベースにも保存します。テスト後にデータベースの内容はロールバックされるので、テストが終了するごとに状態がクリーンに保たれます。

user = create(:user)

モデルのテストコード

FactoryBotを使って、モデルのテストを簡単に書くことができます。以下に、Userモデルのテストコードの例を示します。

spec/models/user_spec.rbというファイルを作成し、以下のように記述します。

  describe '#create' do
    context 'when nickname is empty' do
      it "should be invalid" do
        # nicknameを空にしてユーザーを生成
        user = build(:user, nickname: '')
        expect(user).not_to be_valid
        
        # nicknameが空の場合にエラーメッセージが含まれていることを確認
        expect(user.errors[:nickname]).to include("が入力されていません。")
      end
    end
  end
end


build(:user, nickname: '') で、nickname が空のユーザーインスタンスを生成します。
nickname が空の場合にエラーメッセージが正しく表示されることを確認します。

最後に

最後まで読んでいただきありがとうございました。
この記事を読んでFactoryBotの基本的な使い方の理解が少しでも深まれば幸いです。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1