🌐

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レスポンス検証