STDIN を使うテスト
前回の続き。
ブクマコメで、id:kits さんより、
STDINは local *STDIN = *DATA; もできそう。
とのご指摘。確かに出来そうなので試してみました。
#!/usr/bin/perl use strict; use warnings; use Test::More "no_plan"; sub add { my $result = 0; while( <STDIN> ) { chomp; $result += $_; } return $result; } { local *STDIN; *STDIN = *DATA; is(add, 3); } __DATA__ 1 2
で、実行。
tsucchi@immature[101]% perl a.pl ok 1 1..1
大丈夫みたいです。
- Test::Base に慣れている人
- 追加のモジュールを入れたくない/入れられない場合
- 試さなきゃいけないテストパターンが少ない場合
の場合はこっちのほうが良さげですね。
オイラの場合は、
- Test::Base に慣れてない...
- 追加のモジュールは基本的に入れ放題
- 入力パターンが1個しかないことはめったに無い
ので、前回のやり方の方が好きかな。あとは「入力とそれに対する結果はなるべく近くに置きたい」ってのもある。
まあ Perl なので、「やり方はいろいろある」ということですね。
追記(2009/01/25)
- 入力パターンが1個しかないことはめったに無い
って書いたけど、「1個な場合もあるなぁ」、と思いました。
シナリオベースのテストの場合です。
シナリオテストな場合、シナリオ毎にテストファイルを作るはず。で、テストファイル内の入力量は比較的沢山、でも普通なら1シナリオ1パターンだから、データの種類は1つだけ。
なので、この場合は、__DATA__ に書いて、STDIN を捻じ曲げて __DATA__ を読むのが一番いいかな、と思いました。記述が一番シンプルになるだろうから。
それにしても、何となく書いた仕事メモだったのに、すごく勉強になりました。id:kits さんに感謝!