itochin2の日記(仮)

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

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単体テストがとても捗るというお話。
例外が投げられてくるケースも、息を吸って吐くように書けますなぁ。