¿Cómo puedo capturar la salida de una carpa en Perl?
warnings try-catch (3)
Desde esta página, http://perldoc.perl.org/perlvar.html , parece que desea establecer el $SIG{__WARN__}
en una subrutina que convertirá las advertencias en errores fatales para su script de prueba. El ejemplo que dan es:
local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;
Estoy escribiendo un módulo Perl, y estoy usando carp para devolver una advertencia no fatal al programa de llamadas.
La advertencia de carpa funciona bien. Estoy comprobando si un parámetro de entrada cumple una determinada condición. Si no cumple con la condición, se envía una advertencia con carp y el módulo continúa utilizando un valor predeterminado para el parámetro en lugar del programa de llamada. pasado. La advertencia es solo para notificar que se está utilizando un parámetro predeterminado en lugar del parámetro pasado.
Mi problema es con mi script de prueba. Mi script de prueba está enviando un parámetro incorrecto al módulo, y estoy tratando de captar el mensaje de advertencia que aparece y asegurarme de que recibí el mensaje de advertencia correcto.
Mi módulo se ve así:
else {
carp "value must be numeric - using default value";
}
y mi script de prueba se ve así:
eval {
#call to my module
};
like (
$@,
qr/value must be numeric/,
"Should abort on non-numeric value"
);
Cuando ejecuto la prueba, puedo ver la advertencia (debe ir a STDERR) en la pantalla, pero el contenido de la variable $ @ está '''' - en blanco.
Aquí está el resultado de mi script de prueba:
t/04bad_method_calls....ok 10/12value must be numeric - using default value at ...
# Failed test ''Should abort on non-numeric value''
# at t/04bad_method_calls.t line 98.
t/04bad_method_calls....NOK 12
# '''' doesn''t match ''(?-xism:value must be numeric)''
# Looks like you failed 1 test of 12.
Si cambio la carpa a un graznido, mi script de prueba funciona: capta el mensaje de error (pero solo quiero advertir, no abortar).
Para ser sincero, no tengo la mejor comprensión de eval - tal vez esa no sea la mejor manera de captar el resultado de advertencia de la carpa. Intenté usar $ SIG { WARN }, pero también estaba vacío.
¿Hay alguna manera de capturar el rendimiento de la carpa? No es el mejor negocio, ya que es solo en mi script de prueba, pero aún me gustaría que mi script de prueba funcione correctamente.
¡Gracias por adelantado!
Otra forma de detectar advertencias y también toda la producción de STERR
:
my $stderr = '''';
{
local *STDERR;
open STDERR, ''>'', /$stderr;
do_stuf_here();
}
like( $stderr, qr/my result/, ''test stderr output'' );
Uno puede hacer una elegante función de prueba:
sub stderr_test (&$$) {
my ( $code, $pattern, $text ) = @_;
my $result = '''';
{
local *STDERR;
open STDERR, ''>'', /$result;
$code->();
}
if ( UNIVERSAL::isa( $pattern, ''Regexp'' ) ) {
like( $result, $pattern, $text );
}
else {
is( $result, $pattern, $text );
}
}
# usage
stderr_test {do_stuf_here} qr/my expected STDERR output/,
''stderr is like'';
stderr_test {do_stuf_here} ''my expected STDERR output'',
''stderr is exactly'';
Si está haciendo esto desde un script de prueba, puede usar los módulos Test :: * que capturan el resultado por usted. Tiendo a gustarme Test :: Output .