我运行了这个测试脚本:
use strict;
use warnings;
use Test::More tests => 3;
use Carp;
ok(1<2);
pass();
fail();
croak "example";
使用命令行
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.
如果我使用
perl -MCarp=verbose foo.pl
运行它,则没有问题。是什么导致 prove
拒绝冗长的鲤鱼?当 croak
没有全局替换 croak
到 confess
时,如何从我的测试中获得完整的调用堆栈? 最佳答案
prove -M
似乎不等同于 perl -M
。它似乎加载了一个证明扩展,而不是将模块加载到您的测试中。文档在这一点上完全不清楚,但 App::Prove 中的代码不是。因此 prove -MCarp=verbose
将 Carp::verbose 导入 App::Prove 导致上述问题。
执行所需操作的一种简单方法是使用PERL5OPT环境变量以及Carp::Always,它将所有警告和死亡(以及鲤鱼和吱吱声)转换为堆栈跟踪。
PERL5OPT=-MCarp::Always prove ...
这具有在任何情况下工作的额外好处,无论是否有证明。