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?

¿Fue útil?

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:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top