最近は test-unit しか使ってないので test-unit と rack-test を使って rack middleware のテストを書く術をメモっておく。例えば response.body に foo という文字列を追加する middleware のテストならこんな感じ。
require 'test/unit'
require 'rack/test'
require 'rack-foo'
class TestApp
def call(env)
[
200,
{ 'Content-Type' => 'text/html' },
['<html><head></head><body></body></html>']
]
end
end
class FooTest < Test::Unit::TestCase
include Rack::Test::Methods
def app
Rack::Builder.new {
map "/" do
use ::Rack::Foo
run TestApp.new
end
}.to_app
end
def test_foo
get '/'
assert last_response.body.include? "foo"
end
end
ポイントは Rack::Builder を使って middleware を適用した rack アプリを改めて作るというところらしい。middleware にはオプション引数を渡すというやり方もあるんだけど、その場合は Test::Unit::TestCase
を継承したクラスをもう一つ作らないと app を使い回すとかはできないみたい。
最近、社内で共通で使えるライブラリをバンバン作る時に middleware も結構作るんで今後はこんな感じでテスト書いていく。