ACTUALIZACIÓN: en mi humilde opinión, la respuesta correcta a esta pregunta debe ser el uso de 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');
Salida:
C:\Temp> tm
1..1
ok 1 - myfunc() returns test output
dejo la respuesta original para referencia, Creo que todavía ilustra una técnica útil.
Puede localizar STDOUT
y volver a abrir a un escalar antes de llamar a la función, restaura después:
#!/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'");
Salida:
C:\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'
Para las versiones de perl
mayores de 5,8, es probable que necesite usar IO::Scalar, pero no sé mucho sobre cómo funcionaban las cosas antes de 5.8.
Justo cuando creo que estoy perdiendo demasiado tiempo en SO, ¡aprendo algo genial! Gracias. – FMc
Bueno, técnicamente no, pero seguro que es bueno cuando lo hacen. : p (+1, es un módulo impresionante) –
No lo voté negativamente, pero creo que la respuesta original hace demasiado trabajo para hacer el trabajo. Es demasiado complicado. Sin embargo, estoy un poco predispuesto hacia Test :: Output, pero lo uso como último recurso. –