UPDATE: IMHO, prawidłowa odpowiedź na to pytanie powinna być użycie Test::Output:
#!/usr/bin/perl
use strict; use warnings;
use Test::More tests => 1;
use Test::Output;
sub myfunc { print "This is a test\n" }
stdout_is(\&myfunc, "This is a test\n", 'myfunc() returns test output');
wyjściowa:
C:\Temp> tm
1..1
ok 1 - myfunc() returns test output
Wyjeżdżam oryginalnego odpowiedź dla odniesienia jak, Wierzę, że nadal ilustruje przydatną technikę:.
można zlokalizować STDOUT
i ponownie do skalara przed wywołaniem funkcji przywracania potem:
#!/usr/bin/perl
use strict; use warnings;
use Test::More tests => 1;
sub myfunc { print "This is a test\n" }
sub invoke {
my $sub = shift;
my $stdout;
{
local *STDOUT;
open STDOUT, '>', \$stdout
or die "Cannot open STDOUT to a scalar: $!";
$sub->(@_);
close STDOUT
or die "Cannot close redirected STDOUT: $!";
}
return $stdout;
}
chomp(my $ret = invoke(\&myfunc));
ok($ret eq "This is a test", "myfunc() prints test string");
diag("myfunc() printed '$ret'");
wyjściowa:
C:\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'
Dla wersji perl
starszych niż 5,8, to prawdopodobnie trzeba użyć IO::Scalar, ale nie wiem zbyt wiele o tym, jak rzeczy działały przed 5.8.
Właśnie wtedy, gdy myślę, że tracę zbyt dużo czasu na SO, uczę się czegoś fajnego! Dzięki. – FMc
Cóż, technicznie nie, ale na pewno jest fajnie, kiedy to robią. : p (+1, to niesamowity moduł) –
Nie pochwaliłem tego, ale myślę, że odpowiedź orginalna robi za dużo pracy, aby wykonać zadanie. To zbyt skomplikowane. Jestem nieco stronniczy w Test :: Output, ale używam go w ostateczności. –