Sinatra+Warden で作ったアプリを Rspec でテストする

先日、Test::Unit を使って、Sinatra+Warden で作られたサンプルのテストを書きました。でも、Ruby でテストを書くなら、Test::Unit よりも Rspec の方が人気だし、自分好みです。せっかくなんで、Rspec でも同様のテストを書いてみます。

# coding: utf-8
require "./app"
require "rspec"
require "rack/test"

describe "SinatraWardenSample" do
  include Rack::Test::Methods
  include Warden::Test::Helpers

  def app
    Sinatra::Application
  end

  context "ログインしていない" do
    it "/ にアクセスするとログインページを表示するべき" do
      get "/"
      last_response.body.should include("Login")
    end
  end

  context "ログインしている" do
    before do
      @user = { :name => "test", :password => "test" }
      login_as @user
    end

    after do
      logout
    end

    it "/ にアクセスするとログイン済みページを表示するべき" do
      get "/"
      last_response.body.should include("Hello Sinatra-Warden")
    end

    it "/logout にアクセスするとログアウトするべき" do
      get "/logout"
      last_request.env["warden"].user.should be_nil
    end
  end
end

Rspec でも、Warden のヘルパーは使えました。Rspec だとログイン時のテストとログアウト時のテストを、キレイに分けて書けました。うん。今度から、Sinatra でアプリを作る時のテストは Rspec で書くことにします。