Por que não vai provar aceitar -mcarp = verbose?
Pergunta
Eu executei este script de teste:
use strict;
use warnings;
use Test::More tests => 3;
use Carp;
ok(1<2);
pass();
fail();
croak "example";
Usando a linha de comando prove -MCarp=verbose -v foo.pl
, e obteve os seguintes erros:
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.
Se eu executar usando perl -MCarp=verbose foo.pl
nao há problema. O que está causando prove
Para rejeitar carpa detalhada? Como posso obter uma pista de chamada completa dos meus testes quando eles croak
sem substituir global croak
para confess
?
Solução
prove -M
não parece ser equivalente a perl -M
. Parece carregar uma extensão de provar, não carregar um módulo em seus testes. Os documentos não são totalmente claros nesse ponto, mas o código no app :: Prove não é. Então prove -MCarp=verbose
Importa carp :: verbose no app :: Prove causar o problema acima.
Uma maneira simples de fazer o que você deseja é usar a variável de ambiente Perl5Opt Plus Carp :: sempre que transformará todos os avisos e morre (e carpas e croaks) em traços de pilha.
PERL5OPT=-MCarp::Always prove ...
Isso tem o benefício adicional de trabalhar em qualquer situação, com ou sem provar.
Outras dicas
Prove tem um conjunto muito diferente de argumentos da linha de comando que o Perl, sendo um programa completamente diferente?
Prove's -m é, acredito, destinado a permitir pragmas; O CARP realmente exporta uma referência a termo a uma sub -rotina verbose (), que interfere no funcionamento interno do Prove.
Você pode criar um pequeno módulo como este:
# Verbme.pm
use Carp;
$Carp::Verbose = 1;
e habilitá -lo de provar:
prove -MVerbme -v foo.pl
no entanto.
Carp usa o exportador EXPORT_FAIL
mecanismo para lidar com o verbose
"Opção" para import
, o que é praticamente errado, como Exporter::Heavy
ainda tentará atribuir *Carp::verbose
para *{"$callerpkg::verbose"}
Apesar do fato de ter sido "falhou". Infelizmente, App::Prove
tem um sub verboso de que depende do trabalho, e sua opção -m faz com que a importação aconteça dentro App::Prove
. Não tenho certeza de quem é o culpado aqui - Carp
para (AB) usando EXPORT_FAIL
Dessa forma, ou Exporter::Heavy
por não remover coisas de @imports
Se estiver no @failed
lista, mas juntos estão quebrando :)