Hatena::ブログ(Diary)

ヤルキデナイズドだった

Yarukidenized

2011-12-12

[]Perl 6でモックテスト 23:53 Perl 6でモックテストを含むブックマーク

Perl Advent Calendar 2011の12日目の記事です。

Test::Mock を使うとモックテストが書けます。

use v6;
use Test;
use Test::Mock;

plan 2;

class Dog {
    method bark() {
        say 'bowwow';
    }

    method eat($food) {
    }
}

my $dog = mocked(Dog);

$dog.bark;
$dog.bark;
$dog.eat('fish');

check-mock($dog,
    *.called('bark', times => 2),
    *.called('eat', times => 1, with => \('fish')),
);

だいたい見たまんまですね。*.called('eat', times => 1, with => \('fish')) これは解説が必要かもしれません。 \('fish')Capture オブジェクトを返します。キャプチャとは、ざっくりいうと関数呼び出しのカッコの中身をそのまま保持するオブジェクトです。実際に $dog.eat() に渡された引数のキャプチャと、 with オプションで指定したキャプチャをスマートマッチで比較し、一致すればテスト成功ということになります。

with オプションには *.called('eat', times => 1, with => :(Str)) このように Signature オブジェクトを渡すこともできます。シグネチャは関数定義のカッコの中身(仮引数の並び)を保持するオブジェクトです。シグネチャを渡すと、$dog.eat() に渡された引数がシグネチャにマッチするか(つまり、そのようなシグネチャを持つ関数が仮に存在するとして、その引数で呼び出すことができるか)をチェックします。

トラックバック - http://d.hatena.ne.jp/uasi/20111212/1323701605