1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】RSpec + FactoryBotを導入してModel Specを書くまで

1
Posted at

本記事の概要

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

developmenttestに入れるのは、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を作れます。

buildcreateの違い

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についても学んでいきたいと思います。

1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?