認証に Devise を使っている Rails アプリの Request Specs の書き方

認証に Devise を使っている Rails アプリ の Request Specs の書き方をネットで調べたら、ヒットしたのは Request Specs + Capybara の情報ばかりだった。今 Rails で作っているのは Web API だから、Capybara は要らないんだよな。Request Specs だけでいいのに。そもそも、Request Specs の資料も少ないね。

StackOverflow をはじめ、海外のフォーラムやブログで調べながらトライ&エラーを繰り返した結果、Devise を使っている Rails アプリの Request Spec は次のような書き方に行き着いた。

# coding: utf-8
require "spec_helper"

describe "List" do
  describe "GET /lists" do
    before do
      # テスト用のユーザーを作成
      @user = User.create!(:email => "test@example.com", :password => "test1234")

      # テストデータを作成
      FactoryGirl.create(:list, :user_id => @user.id, :name => "foobar")

      # ログイン
      post_via_redirect user_session_path, {
          "user[email]" => "test@example.com",
          "user[password]" => "test1234",
      }
    end

    after do
      # ログアウト
      destroy_via_redirect destroy_user_session_path
    end

    it "response body should include 'foobar'" do
      get lists_path, nil, { "HTTP_ACCEPT" => "application/json" }
      response.body.should include("foobar")
    end
  end
end

もっと良い方法があるかもしれないけど、とりあえずこれで Request Specs 書いていく。