🌐
Request Specs
HTTPリクエスト/レスポンスをテストする統合テスト
Request SpecはControllerテストを代替する統合テストです。実際のHTTPリクエストをシミュレートしてルーティングからレスポンスまで全スタックをテストします。
RSpec.describe 'Posts', type: :request do
let(:user) { create(:user) }
let(:post_record) { create(:post, user: user) }
describe 'GET /posts' do
it '一覧を返す' do
get posts_path
expect(response).to have_http_status(:success)
end
end
describe 'POST /posts' do
context 'ログイン状態' do
before { sign_in user } # Deviseヘルパー
it '新しいポストを作成する' do
expect {
post posts_path, params: { post: { title: 'タイトル', content: '内容' } }
}.to change(Post, :count).by(1)
expect(response).to redirect_to(post_path(Post.last))
end
end
context '未ログイン状態' do
it 'ログインページにリダイレクト' do
post posts_path, params: { post: { title: 'タイトル' } }
expect(response).to redirect_to(new_user_session_path)
end
end
end
end
キーポイント
1
spec/requests/ディレクトリにスペックファイル生成
2
get/post/patch/deleteメソッドでHTTPリクエストをシミュレート
3
params:オプションでリクエストパラメータを伝達
4
headers:オプションでリクエストヘッダー設定(Turbo Stream等)
5
expect(response).to have_http_status(:success) — ステータスコード検証
6
expect { action }.to change(Model, :count) — データ変更検証
メリット
- ✓ 実際のHTTPリクエストシミュレーション — 現実的なテスト
- ✓ ルーティングからレスポンスまでフルスタック検証
- ✓ Controller + View統合テスト
- ✓ Devise等ミドルウェアとの相互作用テスト
デメリット
- ✗ 単体テストより遅い
- ✗ 失敗時の原因追跡が複雑になりうる
- ✗ ビューレンダリング含みでテスト時間増加
- ✗ 細かいControllerロジックテストには不向き
ユースケース
CRUDエンドポイントテスト
認証/権限テスト
Turbo Streamレスポンステスト
APIレスポンス検証