はじめに
こんにちは!
社会人一年目の石川です。
記事をご覧いただきありがとうございます。
現在、私はRSpecを使ってモデルのテストコードを書いています。その際にFactoryBotを活用しているため使い方をまとめます。
目次
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の基本的な使い方の理解が少しでも深まれば幸いです。