Rails 8 時代でも RSpec は引き続き最も使われるテストフレームワークです。 RSpec そのものの大きな仕様変更は少ないものの、Rails 側の変更(Hotwire/Turbo やアセット方式変更)に引きずられる形で、テスト手法のベストプラクティスが変化しています。
このページでは、Rails 3〜4 時代(当Wikiの旧ページ)から 2025 年(Rails 7〜8 時代)までの変化をまとめます。
Rails 6 以降、System Spec(Capybara + headless Chrome) が正式サポートされ、 Rails 8 時代では以下のような構成が定番になりました。
これらをテストするには Turbo を考慮した記述 が必要です。
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
Rails 7〜8 では API 構築が一般化し、 Controller Spec → 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
Rails 3〜4 時代は fixture / factory_girl 混在でしたが、 今では FactoryBot が前提 といってよいレベルで定着しました。
let(:user) { create(:user) }
let(:post) { build(:post, user: user) }
Rails 8 時代では下記が特に重要です。
モダン Rails のフロントは:
など、動的な UI が普通 になり、View 単体テストは実用性が低下しました。
現在は System Spec と Request Spec に集約 する流れ。
Rails 3〜4 時代と変わらず重要で、特に:
これらは model spec / service spec として書くのが主流。
Rails 7 以降、非同期更新を扱う Turbo Streams のテストが可能になりました。
expect(response.media_type).to eq("text/vnd.turbo-stream.html")
expect(response.body).to include("turbo-stream")
Rails 側の仕様変更で、DB トランザクションやテスト用ヘルパーの挙動が安定し、 従来よりも予期せぬエラーが起きにくくなっています。
近年の RSpec では次が標準:
Docker / CI でも構築しやすくなりました。
Rails 8 時代の RSpec は以下のように整理されます。