SinatraとWardenで作ったアプリを Test::Unit でテストする

Sinatra は手軽に Web アプリが書けるので、ペラサイト程度なら、テストを書かずにサクっと作り上げることが多いです。私の場合は。

だけど、認証が絡んで複雑になってきたら、テストが無いと不安になります。精神衛生的にテストは必要。テストが有るのと無いとじゃ、修正するときの安心感が違いますからね。

先日作った Sinatra + Warden のサンプルのテストを、Test::Unit で書いてみました。

# coding: utf-8
require "./app" # テスト対象のアプリを読み込む
require "test/unit"
require "rack/test"

# ログインしているときのテスト
class AppLoggedinTest < Test::Unit::TestCase
  include Rack::Test::Methods
  include Warden::Test::Helpers

  def app
    Sinatra::Application
  end

  def setup
    # ログインユーザーを用意
    @user = { :name => "test", :password => "test" }

    login_as @user
  end

  def teardown
    logout
  end

  def test_index
    get "/"

    assert last_response.ok?
    assert last_response.body.include?("Hello Sinatra-Warden")
  end

  def test_logout
    get "/logout"

    assert last_response.redirect?
    assert last_request.env["warden"].user.nil?
  end
end

Sinatra のテストでは、Rack::Test を使います。あと、Warden はテスト用のヘルパーを提供していて、ログインをエミューレートできます。