UPDATE: IMHO, la risposta corretta a questa domanda dovrebbe essere quello di utilizzare 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');
uscita:
C:\Temp> tm
1..1
ok 1 - myfunc() returns test output
Lascio la risposta originale per riferimento, Credo, illustra ancora una tecnica utile.
È possibile localizzare STDOUT
e riaprire ad uno scalare prima di chiamare la funzione, il ripristino in seguito:
#!/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'");
uscita:
C:\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'
Per le versioni di perl
di età superiore a 5,8, probabilmente è necessario utilizzare IO::Scalar, ma non so molto su come funzionavano le cose prima del 5.8.
fonte
2009-10-08 14:46:34
Proprio quando penso di perdere troppo tempo in SO, imparo qualcosa di interessante! Grazie. – FMc
Beh, tecnicamente no, ma sicuramente è bello quando lo fanno. : p (+1, questo è un modulo fantastico) –
Non l'ho svalutato, ma penso che la risposta originale faccia troppo lavoro per portare a termine il lavoro. È troppo complicato Sono un po 'prevenuto verso Test :: Output, però, ma lo uso come ultima risorsa. –