本当にただのメモ

なるべく Qiita に投稿しよう

Test::Deep の methods()

https://metacpan.org/pod/Test::Deep#methods

オブジェクトをまるっと cmp_deeply するのではなく、一部のメソッドの値だけテストしたいときに便利な test utility 。

#!/usr/bin/env perl
use common::sense;
use Test::More;
use Test::Deep;

package MyClass {
    sub new {
        my ($class, %args) = @_;
        bless \%args, $class;
    }
    sub prop { shift->{prop} }
}

my $obj1 = MyClass->new(prop => 'foo');
my $obj2 = MyClass->new(prop => 'bar');

cmp_deeply $obj1, methods(prop => 'foo');
cmp_deeply [$obj1, $obj2], [
    methods(prop => 'foo'),
    methods(prop => 'bar'),
];

done_testing;

ただ、 $obj1 , $obj2 が MyClass のインスタンスかまで検証しないと厳密なテストにならないので、以下のほうがベター。

cmp_deeply $obj1, isa('MyClass') & methods(prop => 'foo');
cmp_deeply [$obj1, $obj2], [
    isa('MyClass') & methods(prop => 'foo'),
    isa('MyClass') & methods(prop => 'bar'),
];

& については Test::Deep のドキュメント 参照。 & を演算子のオーバーロードしている。