全てのコードにテストを(標準入力乗っ取り編)

テストコード書くのってピタゴラ装置作るみたいで楽しいですよね。 というわけであらゆるコードにはテストコードを用意してあげたい! けどそういうときちょっとめんどくさいのが、昔ながらの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 さんに渡します。