¿Por qué no resultará aceptar -MCarp = prolijo?
Pregunta
Me encontré con este script de prueba:
use strict;
use warnings;
use Test::More tests => 3;
use Carp;
ok(1<2);
pass();
fail();
croak "example";
utilizando el prove -MCarp=verbose -v foo.pl
línea de comandos, y tiene los siguientes errores:
Subroutine App::Prove::verbose redefined at /opt/ActivePerl-5.12/lib/App/Prove.pm line 407
App::Prove::_load_extension('App::Prove=HASH(0x683718)', 'Carp=verbose') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 419
App::Prove::_load_extensions('App::Prove=HASH(0x683718)', 'ARRAY(0x683850)') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 481
App::Prove::run('App::Prove=HASH(0x683718)') called at /opt/ActivePerl-5.12/bin/prove line 11
Undefined subroutine &Carp::verbose called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 484.
Si lo ejecuto usando perl -MCarp=verbose foo.pl
no hay problema. ¿Qué está causando prove
rechazar detallado de la carpa? ¿Cómo puedo obtener una pila de llamadas completa de mis pruebas cuando croak
sin reemplazar mundial croak
a confess
?
Solución
prove -M
no parece ser equivalente a perl -M
. Al parecer, para cargar una extensión de demostrar, no cargar un módulo en sus pruebas. Los documentos son totalmente claro en este punto, pero el código en el App :: Prove no lo es. Así importaciones prove -MCarp=verbose
Carp :: detallado en App :: Demostrar que causa el problema anterior.
Una forma sencilla de hacer lo que quiere es utilizar la variable de entorno PERL5OPT además Carp :: siempre que convertirá todo advierte y troqueles (y carpas y graznidos) en seguimientos de pila.
PERL5OPT=-MCarp::Always prove ...
Esto tiene el beneficio adicional de trabajar en cualquier situación, con o sin demostrar.
Otros consejos
probar tiene un conjunto muy diferente de los argumentos de línea de comandos que Perl, al ser un programa completamente diferente?
de demostrar -M es, creo, destinada a permitir pragmas; Carp realidad exporta una referencia hacia adelante a una subrutina prolijo (), que interfiere con la de demostrar funcionamiento interno.
Se puede crear un pequeño módulo de esta manera:
# Verbme.pm
use Carp;
$Carp::Verbose = 1;
y active desde probar:
prove -MVerbme -v foo.pl
sin embargo.
Carp utiliza el mecanismo de EXPORT_FAIL
del exportador para manejar la "opción" verbose
a import
, que es más o menos mal, como Exporter::Heavy
seguirá tratando de *Carp::verbose
asignar a *{"$callerpkg::verbose"}
a pesar del hecho de que fue "no". Por desgracia, App::Prove
tiene una sub detallado que depende de trabajo, y su opción -M hace que la importación a suceder dentro de App::Prove
. No estoy seguro de quién es el culpable aquí - para Carp
(ab) uso de EXPORT_FAIL
de esta manera, o Exporter::Heavy
para no quitar cosas de @imports
si está en la lista @failed
, pero juntos Son romperlo:)