アットウィキロゴ

Rspec

RSpec(Rails 3 → Rails 8)変更点まとめ


概要

Rails 8 時代でも RSpec は引き続き最も使われるテストフレームワークです。 RSpec そのものの大きな仕様変更は少ないものの、Rails 側の変更(Hotwire/Turbo やアセット方式変更)に引きずられる形で、テスト手法のベストプラクティスが変化しています。

このページでは、Rails 3〜4 時代(当Wikiの旧ページ)から 2025 年(Rails 7〜8 時代)までの変化をまとめます。


主な変化ポイント

● 1. System Spec(Feature Spec)+ Turbo が現代標準に

Rails 6 以降、System Spec(Capybara + headless Chrome) が正式サポートされ、 Rails 8 時代では以下のような構成が定番になりました。

  • ページ遷移(Turbo Drive)
  • 非同期更新(Turbo Streams)
  • モーダル・部分更新(Turbo Frames)

これらをテストするには Turbo を考慮した記述 が必要です。

Turbo を考慮した System Spec の例

require "rails_helper"

RSpec.describe "Posts", type: :system do
  it "記事を作成できる" do
    visit new_post_path

    fill_in "タイトル", with: "テスト記事"
    fill_in "本文",     with: "内容だよ"

    click_button "保存"

    # Turbo の遷移を待つ
    expect(page).to have_content("作成しました")
  end
end

● 2. Request Spec が API テストの定番に

Rails 7〜8 では API 構築が一般化し、 Controller Spec → Request Spec に移行がほぼ完了したと言えます。

  • JSON API
  • SPA(React / Vue / Svelte)との連携
  • モバイルアプリ向け API

これらは Request Spec でまとめてテストするのが主流。

Request Spec の例(全角化済)

require "rails_helper"

RSpec.describe "API::Posts", type: :request do
  describe "POST /api/posts" do
    it "投稿を作成できる" do
      params = { post: { title: "abc", body: "def" } }

      post api_posts_path, params: params

      expect(response).to have_http_status(:created)
      expect(JSON.parse(response.body)["title"]).to eq("abc")
    end
  end
end

● 3. FactoryBot の利用が前提化

Rails 3〜4 時代は fixture / factory_girl 混在でしたが、 今では FactoryBot が前提 といってよいレベルで定着しました。

よく使う構文

let(:user) { create(:user) }
let(:post) { build(:post, user: user) }

Rails 8 時代では下記が特に重要です。

  • trait を使ったデータ定義
  • association を使った関連モデルの生成
  • transient で生成を制御する実践パターン

● 4. View Spec / Helper Spec はほぼ使われない

モダン Rails のフロントは:

  • Turbo
  • Stimulus
  • React/Vue(SPA)

など、動的な UI が普通 になり、View 単体テストは実用性が低下しました。

現在は System Spec と Request Spec に集約 する流れ。


● 5. model spec(単体テスト)は今でも必須

Rails 3〜4 時代と変わらず重要で、特に:

  • バリデーション
  • スコープ
  • サービスクラス(PORO)
  • QueryObject

これらは model spec / service spec として書くのが主流。


● 6. Hotwire(Turbo Streams)のテストが追加された

Rails 7 以降、非同期更新を扱う Turbo Streams のテストが可能になりました。

Turbo Stream のレスポンス判定

expect(response.media_type).to eq("text/vnd.turbo-stream.html")

Turbo Stream の内容をチェック

expect(response.body).to include("turbo-stream")

● 7. Before/after コールバックの扱いがシンプルに

Rails 側の仕様変更で、DB トランザクションやテスト用ヘルパーの挙動が安定し、 従来よりも予期せぬエラーが起きにくくなっています。


● 8. headless Chrome(Capybara)の安定化

近年の RSpec では次が標準:

  • headless Chrome
  • driven_by(:selenium, using: :chrome)
  • または Webdrivers の自動更新

Docker / CI でも構築しやすくなりました。


まとめ

Rails 8 時代の RSpec は以下のように整理されます。

  • System Spec が UI テストの主流
  • Request Spec が API テストを担当(Controller Spec は廃止的扱い)
  • FactoryBot がデファクト
  • View Spec / Helper Spec はほぼ使用されない
  • Turbo(Streams/Frames/Drive)に対応したテスト記述が必要
  • headless Chrome が標準で安定化
最終更新:2025年12月10日 07:25