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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top