STDIN/STDOUT を使うテスト その2
id:gfx さんより、トラバで、PerlIO の IO::scalar を使う方法を教えていただきました。
IO::scalarでIOのキャプチャ - use GFx::WebLog;
標準モジュールのIO::scalarでもIOキャプチャできますよ。
と、言うわけで私も試してみました。例の題材は前と同じです。
まずは STDIN。gfx さんのところのサンプルをほぼ丸パクリです。
#!/usr/bin/perl use strict; use warnings; use Test::More tests => 1; sub add { my $result = 0; while( <STDIN> ) { $result += $_; } return $result; } { my $inputs = "1\n2\n3\n"; open my $IN, '<', \$inputs; local *STDIN = *$IN; is( add(), 6 ); close($IN); }
こんな感じ。で、実行すると、
tsucchi@appears[103]% prove aa.pl aa.......ok All tests successful. Files=1, Tests=1, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.12 cusr 0.08 csys = 0.22 CPU) Result: PASS
大丈夫そうです。
STDOUT もやってみましょう。捻じ曲げる方向を逆にすればいいんだよね?
#!/usr/bin/perl use strict; use warnings; use Test::More tests => 1; sub add { my( $a, $b ) = @_; print $a + $b; } { my $output; open my $OUT, '>', \$output; local *STDOUT = *$OUT; add(1, 2); close($OUT); is( $output, 3 ); }
で、実行
tsucchi@appears[104]% prove ab.pl ab.......ok All tests successful. Files=1, Tests=1, 0 wallclock secs ( 0.00 usr 0.00 sys + 0.14 cusr 0.05 csys = 0.19 CPU) Result: PASS
こっちも大丈夫そうです。
モジュールを使った場合とそんなに記述性も変わらないし、これはいいですね!