理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Test::Base での上手い書き方はないものか

簡単なアクセサのテストを Test::Base で書くとして、ちょっと困ったことがありました。
Read アクセサとして、単なるスカラー値と、リファレンス(例えば aref) を戻すのがあって、その戻り値が正しいかという基本的なテストをしたい。Test::Base::run の中はできるだけシンプルに書きたいと思ってる。
今のところ、以下のような形で、run の中でブロックの名前を元に処理を分岐させてるんだけど、もうちょっと良い方法(if 文のない方法)はないかなーと思っています。
dumper フィルタあたりをうまくカマせるのが良いのかな。。。

use strict;
use warnings;
use TestObj;
use Test::Base;

my $obj = TestObj->new({
    a => 'a',
    b => 'b',
    c => [qw/c d/],
});

filters {
    input    => [qw/chomp/],
    expected => [qw/chomp/],
};

run {
    no strict 'refs';
    my $block = shift;

    my $accessor = $block->input;
    if ( $block->name eq 'c' ) {
        is_deep( $obj->$accessor => $block->expected, $block->name );
    }
    else {
        is $sub->accessor => $block->expected, $block->name;
    }
};

__DATA__
=== a
--- input
a
--- expected
a

=== b
--- input
b
--- expected
b

=== c
--- input
c
--- expected eval
[qw/c d/]