本記事の概要
RailsアプリにRSpecとFactoryBotを導入して、Model Specを書くまでの手順をまとめます。
初学者向けに、まずは細かい設定を増やさず、
1. RSpecを導入する
2. FactoryBotを導入する
3. テストデータを作る
4. Model Specを書く
5. テストを実行する
という最小限のRSpecテストの実行ができる所まで解説します。
※ 私は現在、エンジニアを目指して学習中のため、内容に誤りや分かりにくい表現が含まれている可能性があります。
この記事は、「RSpecを使いたいけど、まず何から始めればいいんだっけ?」という疑問を解消し、導入まで迷わず進められることを目的にまとめています。初歩的な内容も含まれますが、同じように学習中の方やIT初学者の方の参考になれば幸いです。
RSpec・FactoryBotとは?
まず、それぞれの役割を簡単に整理します。
| 名前 | 役割 |
|---|---|
| RSpec | テストを書いて実行するための仕組み |
| FactoryBot | テスト用データを簡単に作る仕組み |
| Model Spec | モデルのバリデーションや処理を確認するテスト |
| Request Spec | HTTPリクエストやController周辺を確認するテスト |
| System Spec | 実際のユーザー操作に近い形で確認するテスト |
今回はこのうち、RSpec + FactoryBot + Model Specを導入します。
イメージとしては、
RSpec → テストを書く
FactoryBot → テストに必要なデータを作る
Model Spec → モデルが正しく動くか確認する
という関係です。
開発・テスト環境
Ruby 3.4系
Ruby on Rails 8.1系
PostgreSQL
Docker / Docker Compose
RSpec
FactoryBot
※ 開発環境はDocker Composeを使用しています。そのため、記事内のコマンドはDocker環境での実行例も記載しています。
1. GemfileにRSpecとFactoryBotを追加する
Gemfileに以下を追加します。
group :development, :test do
gem "rspec-rails"
gem "factory_bot_rails"
end
developmentとtestに入れるのは、RSpecとFactoryBotが開発・テスト時に使うGemだからです。本番環境でアプリを動かすためには基本的に必要ありません。
2. bundle installする
Gemfileを変更したらインストールします。
bundle install
# Docker Compose使用の場合
docker compose exec web bundle install
3. RSpecを初期化する
RSpecの設定ファイルを作成します。
rails generate rspec:install
# Docker Compose使用の場合
docker compose exec web rails generate rspec:install
実行すると、主に以下のファイルが作成されます。
.rspec
spec/
├── rails_helper.rb
└── spec_helper.rb
これでRSpecを使うための基本的な準備は完了です。
4. FactoryBotのFactoryを作る
次に、テストで使うデータをFactoryBotに定義します。今回はUserモデルを例にします。
以下のファイルを作成します。
spec/factories/users.rb
※
spec/factories/users.rbはFactoryBotのgeneratorを使ってコマンドから作成できます。ただし、初学者のうちはFactoryの仕組みを理解するためにも、まずは手動でファイルを作成するのがおすすめです。
コマンドでの作成方法が気になる方は、「FactoryBot ファイル作成 コマンド」などで調べてみてください。
ファイル内には、例えば以下のように記述します。
FactoryBot.define do
factory :user do
email { "test@example.com" }
password { "password" }
end
end
これは、
テスト用のUserを作るときは、このデータを使う
という設計図です。
FactoryBotを使うと、
FactoryBot.build(:user)
だけで、この定義を使ったUserを作れます。
buildとcreateの違い
FactoryBot.build(:user)
Userオブジェクトを作りますが、DBには保存しません。
FactoryBot.create(:user)
Userオブジェクトを作って、DBにも保存します。
5. Model Specを作る
Userモデルをテストする場合は、以下のファイルを作ります。
spec/models/user_spec.rb
まずは簡単なテストを書きます。
require "rails_helper"
RSpec.describe User, type: :model do
describe "バリデーション" do
it "正しい情報なら有効である" do
user = FactoryBot.build(:user)
expect(user).to be_valid
end
it "メールアドレスがない場合は無効である" do
user = FactoryBot.build(:user, email: nil)
expect(user).not_to be_valid
end
end
end
ここでは2つ確認しています。
正常系
正しいUserなら有効
異常系
emailがnilなら無効
FactoryBotでは、
FactoryBot.build(:user, email: nil)
のように書くことで、Factoryのemailだけを上書きできます。
6. RSpecを実行する
作成したUserのModel Specだけ実行する場合は、
bundle exec rspec spec/models/user_spec.rb
# Docker Compose使用の場合
docker compose exec web bundle exec rspec spec/models/user_spec.rb
すべてのRSpecを実行する場合は、
bundle exec rspec
です。
[私が体験したエラー] build(:user)が定義されていません
最初、私は以下のように書いてテストを実行しました。
user = build(:user)
すると、
NoMethodError:
undefined method 'build'
というエラーが発生しました。
これは、
RSpecからbuildという省略記法をまだ使えるようにしていない
ことが原因でした。
まず、
user = FactoryBot.build(:user)
に変更します。
これでテストが通れば、FactoryBot自体は正常に導入できています。
FactoryBot.を省略する
毎回、
FactoryBot.build(:user)
FactoryBot.create(:user)
と書いても問題ありません。
ただし、
build(:user)
create(:user)
と省略して書くこともできます。
その場合は、
spec/rails_helper.rb
のRSpec.configure内に以下を追加します。
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
すでにspec/rails_helper.rbファイル内にRSpec.configure do |config|のソースコードが存在する場合は、その中に
config.include FactoryBot::Syntax::Methods
だけ追加すればOKです。
これでModel Specを、
require "rails_helper"
RSpec.describe User, type: :model do
describe "バリデーション" do
it "正しい情報なら有効である" do
user = build(:user)
expect(user).to be_valid
end
end
end
のように書けるようになります。
ファイル構成
ここまで進めると、おおよそ以下の構成になります。
spec/
├── factories/
│ └── users.rb
├── models/
│ └── user_spec.rb
├── rails_helper.rb
└── spec_helper.rb
それぞれ、
users.rb → テスト用Userの設計図
user_spec.rb → Userモデルのテスト
rails_helper.rb → Rails + RSpecで使用する共通設定
spec_helper.rb → RSpec自体の共通設定
という役割です。
導入手順まとめ
今回行ったことをまとめると、以下の流れです。
① Gemfileに追加(rspec-rails・factory_bot_rails)
↓
② gemをインストール(bundle install)
↓
③ RSpecを初期化(rails generate rspec:install)
↓
④ Factoryを作る(spec/factories/users.rb)
↓
⑤ Model Specを作る(spec/models/user_spec.rb)
↓
⑥ FactoryBot.build(:user)でテスト
↓
⑦ rails_helper.rbに設定(config.include FactoryBot::Syntax::Methods)
↓
⑧ build(:user)と省略して書ける
所感・まとめ
RSpecやFactoryBotについて調べていると、設定や機能がたくさん出てくるので、最初からすべて理解しようとすると、かなり難しく感じます。
個人的には、まずは
- RSpecは「テストを書く・実行する仕組み」
- FactoryBotは「テスト用データを作る仕組み」
-
build(:user)でテスト用データを作り、expectで結果を確認する
といった主要な部分をざっくり把握して、実際に小さなテストを動かしてみることが大切だと感じました。
user = build(:user)
expect(user).to be_valid
まずはこのようなシンプルなテストを実際に動かし、必要になったタイミングで少しずつ設定や機能を調べていく方が、個人的には理解しやすそうです。
今回の記事では導入部分までですが、今後はModel Specの正常系・異常系や、Request Spec、System Specについても学んでいきたいと思います。