テストコード書くのってピタゴラ装置作るみたいで楽しいですよね。 というわけであらゆるコードにはテストコードを用意してあげたい! けどそういうときちょっとめんどくさいのが、昔ながらのCGIスクリプトやメールフィルタなどのフィルタスクリプト、要はSTDINからデータが入ってくる前提のコードです。 make testやproveからテストする前提だと標準入力に何も渡さないし…、 というわけでこんなかんじでテストを書いてみます。
{
local *STDIN;
open STDIN, '<', 't/data1.txt';
my $rv = SomeFilter->run;
ok $rv;
}
{
local *STDIN;
open STDIN, '<', 't/data2.txt';
my $rv = SomeFilter->run;
ok $rv;
}
各ブロックのlocal文により、各スタック内ではSTDINが上書きされるため、 STDINを受け取る前提のコードに好きなファイルを好きなだけ渡すことができます。 あくまでも各ブロックの中だけ上書きしているので
{
local *STDIN;
open STDIN, '<', 't/data1.txt';
my $rv = SomeFilter->run;
ok $rv;
}
{
my $rv = SomeFilter->run;
ok $rv;
}
とかすると、最後のブロックでは標準入力を待つのが分かります。
{
local *STDIN = *DATA;
SomeFilter->run;
}
__DATA__
blah blah blah
こんな書き方も出来ます。さて、次のバトンは nekokak さんに渡します。