为什么不能证明接受-MCarp = verbose?

Phi*_*ter 4 testing perl carp

我运行了这个测试脚本:

use strict;
use warnings;
use Test::More tests => 3;
use Carp;

ok(1<2);
pass();
fail();
croak "example";
Run Code Online (Sandbox Code Playgroud)

使用命令行prove -MCarp=verbose -v foo.pl,并得到以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

如果我使用它运行它perl -MCarp=verbose foo.pl没有问题.什么导致prove拒绝啰嗦鲤鱼?如果croak没有全局替换croak,我怎样才能从我的测试中获得完整的callstack confess

Sch*_*ern 10

prove -M似乎不等同于perl -M.它似乎加载了证明扩展,而不是将模块加载到您的测试中.文档在这一点上完全不清楚,但App :: Prove中的代码却不是.因此将prove -MCarp=verboseCarp :: verbose导入App :: Prove导致上述问题.

一个简单的方法来做你想要的是使用PERL5OPT环境变量加上Carp :: Always,它会将所有警告和死亡(以及鲤鱼和呱呱声)变成堆栈跟踪.

PERL5OPT=-MCarp::Always prove ...
Run Code Online (Sandbox Code Playgroud)

无论有无证明,这都可以在任何情况下工作.