perlの単体テストでスタブ作るお仕事
get_hoge的なサブルーチンの戻り値を見て、
なんか色々やるサブルーチンのテストを書く時、
get_hogeのシンボルテーブルを上書きしてやれば、テスト項目も自由自在。
no warnings 'redefine'; # 再定義をお許しください宣言 local *Hoge::Model::get_hoge = sub { # 項目に基いた値を返す return +{ id => 1, name => 'aaa', }; }; # テスト対象のサブルーチン sub do_test_func { # $resultには {id=>1, name='aaa'} が入る my $result = Hoge::Model->get_hoge; }
さらに、諸般の事情から、get_hogeをdo_test_funcでn回呼ぶけど
1回目と2回目で結果を変えたいなーって時には
state変数を使えば望みが叶う。
use 5.10; # state宣言は5.10以降 no warnings 'redefine'; # 再定義をお許しください宣言 local *Hoge::Model::get_hoge = sub { state $count = 0; my $result; if ($count == 0) { $result = +{ id => 1, name => 'aaa', }; } elsif ($count == 1) { $result = +{ id => 2, name => 'bbb', }; } $count++ return $result; }; # テスト対象のサブルーチン sub do_test_func { foreach my $dat (@array) { my $result = Hoge::Model->get_hoge($dat); } }
シンボルテーブルの上書きで、perlの単体テストがとても捗るというお話。
例外が投げられてくるケースも、息を吸って吐くように書けますなぁ。