読者です 読者をやめる 読者になる 読者になる

itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

Module::Spyでテンプレートに渡したパラメータのテストをする

概要

JSONを返すAPIのテストなら、スキーマの確認がやりやすいのだけど
テンプレを返すコントローラってどうやってやろうか、という課題。

テンプレを表示して目視する作戦は効率悪いし、絶対漏れるし
継続的にするの無理だし、プログラムのテストとテンプレのテストが
混ざっていてイケてない感。

IFで使用するパラメータを渡しているかが知りたいのであって
分岐した結果の表示は、また別問題だと思うのです。

で、ググった。

[perl] コントローラがどのテンプレを表示したかをテストする - blog.64p.org

テンプレの名前がわかるなら、渡しているパラメータも分かるのでは!?

で、実際にやってみたらできた!

ざっくりこんな感じ。

$spy = spy_on('Text::Xslate', 'render');

# コントローラ呼ぶ
my $mech = Test::WWW::Mechanize::PSGI->new(app => $app);
$dat = $mech->get('/');
is($dat->code. 200);

my $tmpl = $spy->calls_first->[1];
my $tmpl_params = $spy->calls_first->[2];

is($tmpl, '/index.tt');
my ($ok, $error) = ThaiSchema::match_schema(
    $tmpl_params,
    type_hash({
        member_id => type_int(),
        items => type_array(
            id => type_int(),
            name => type_str(),
            num => type_int(),
        ),
        pager => type_hash({
            total_entries => type_int(),
            page => type_int(),
            hashNext => type_bool(),
            rows => type_int(),
        })
    });
);
is_deeply($tmpl_params, $expected);

calls_firstの1番目以降に、renderメソッドに渡しているパラメータが入っているので
あとは煮るなり焼くなり、好きにできて嬉しい。

まとめ

なんかページの表示がおかしいって時に、コントローラのテストを行うことで
俺のせいじゃないです問題の切り分けが素早くできるようになるはず!