2013年2月 2日
Plack::Middlewareで$envの中身を見るテストを書く方法
Plack::Middlewareの中で $env->{'psgix.hoge'}
的な何かを突っ込むことはあるん
じゃないかと思うが、そのテストをどう書くかという話。
Plack::Testだとレスポンスは見られるが、$env
はもう見られない。
結論を言ってしまうと、$envをシリアライズして、response bodyに突っ込んでしまう $appを作るのが乱暴かつお手軽かと思う。
以下サンプルコード。
package Plack::Middleware::Hoge;
use strict;
use warnings;
use parent 'Plack::Middleware';
sub call {
my ($self, $env) = @_;
$env->{'psgix.hoge'} = 'fuga';
$self->app->($env);
}
このMiddlewareをテストする。
use strict;
use warnings;
use Test::More;
use Plack::Test;
use Data::Dumper;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Purity = 1;
use Plack::Middleware::Hoge;
my $app = sub {
my $env = shift;
[200, ['Content-Type' => 'text/plain'], [Dumper $env]];
};
$app = Plack::Middlware::Hoge->wrap($app);
test_psgi $app, sub {
my $cb = shift;
my $res = $cb->(GET '/');
my $env = eval $res->content;
is $env->{'psgix.hoge'}, 'fuga';
};
JSONでシリアライズすることも考えたけど、Data::DumperはPerl5.8でも標準添付 なのでそれでよいかな、と。
以前は$appのなかにokとか書いてたんだけど、そうすると、リクエストに応じて、$app 作り変えないといけなかったりしてめんどくさいのでこういう形に落ち着いた次第。
Plack::Middeware::Outh::OAuthもこの形式でテストがりっと書き換えました。