PSGIアプリのテスト方法

webアプリのテストに関して、Modelについては結構テストしやすいからちゃんとテスト書いてること多いと思うのだけれど、Controllerやviewはテストがしにくいのでテストを書かないなんてことがよくあると思うのだけれど(ぼくだけか?)、PSGIアプリならばTest::TCPPlack::Runnerと任意のHTTPクライアント(LWP::UserAgentでもWWW:::Mechanizeでもお好きなものを)を使ってテストを書けば幸せになれる。

use strict;
use warnings;

use Test::TCP;
use Test::More;

use Plack::Rnnner;
use LWP::UserAgent;

my $server = Test::TCP->new(
    code => sub {
        my $port = shift;
        my $app = sub {
            # your psgi app here
        };

        my $runner = Plack::Runner->new;
        $runner->parse_options("--port" => $port, "-E", "dev", "-s", "HTTP::Server::PSGI");
        $runner->run($app);
    },
);

my $ua = LWP::UserAgent->new;
my $res = $ua->get('http://localhost:'.$server->port);
ok($res->is_success);

こんな感じ。

<追記>
もうちょっと調べたらPlack::Testってのがあるので、これ使うのも良い。っていうかそれ使ったほうが良い。
Plack::Test - Test PSGI applications with various backends - metacpan.org