tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

STDIN/STDOUT を使うテスト その2

STDIN/STDOUT を使うテストの続き。

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

こっちも大丈夫そうです。
モジュールを使った場合とそんなに記述性も変わらないし、これはいいですね!