« 運用におけるcrontabのテストとParse::Crontab | メイン | Module::Advisor便利ですね »

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もこの形式でテストがりっと書き換えました。

投稿者 Songmu : 2013年2月 2日 14:35