Perl测试-获得编译警告,但测试仍然显示一切正常

Perl测试-获得编译警告,但测试仍然显示一切正常,perl,testing,Perl,Testing,我在运行测试时得到了这个结果,但是正如您所看到的,两个测试仍然显示OK。我一点也不喜欢这个。如何将警告转化为错误 1..2 Allowing a native trait to automatically supply a default is deprecated. You can avoid this warning by supplying a default, builder, or making the attribute required at UserInfo.pm line 7

我在运行测试时得到了这个结果,但是正如您所看到的,两个测试仍然显示OK。我一点也不喜欢这个。如何将警告转化为错误

1..2
Allowing a native trait to automatically supply a default is deprecated. You can avoid this warning by supplying a default, builder, or making the attribute required at UserInfo.pm line 7
        require UserInfo.pm called at (eval 4) line 2
        main::BEGIN() called at UserInfo.pm line 0
        eval {...} called at UserInfo.pm line 0
        eval 'package main;
use UserInfo @{$args[0]};
1;

;' called at /packages/run.64/perl-5.14.1/lib/5.14.1/Test/More.pm line 885
        Test::More::_eval('package main;\x{a}use UserInfo @{$args[0]};\x{a}1;\x{a}', 'ARRAY(0x16fa110)') called at /packages/run.64/perl-5.14.1/lib/5.14.1/Test/More.pm line 860
        Test::More::use_ok('UserInfo') called at UserInfo.t line 7
ok 1 - use UserInfo;
ok 2 - require UserInfo;

把警告变成错误?给你

use warnings FATAL=>"all";
如果您不想让脚本死掉,而是想让特定测试失败,您可以将此添加到上面:

use Test::Exception; 

# later
lives_and {
     is ($this->value, 42);
} "Value is 42 (and no warnings)";

另一种方法(如我在下面的评论中所述)是定义警告伪信号处理程序:

my @warn;
$SIG{__WARN__} = sub { push @warn, shift; };

# later
ok (!@warn, "No warnings were emitted");

不推荐的功能仍然有效,但会向您发出它们将消失的信号。停止使用不推荐使用的功能以消除警告


要测试代码运行时是否没有警告,请尝试。

我最终使用了
$SIG{{uuuu WARN}=sub{WARN$[0];die}


这将迫使测试报告错误,即使在出现警告的情况下,仍然打印警告本身。

使用警告致命=>“全部”还不够。@让我想想:
eval
必须在这里阻止异常。我不知道有什么好办法可以绕过这个问题,也许是像
my@warn$SIG{{uuuuu WARN}=sub{push@WARN,shift;}然后
确定(!@warn)
。但是,这可以在模块中重写。嗯?所以
Test::More
被弃用了?什么是替代品?你在惊慌失措之前看过Test::NoWarnings吗?:)为什么要发出警告?只要使用模具。您将停止程序,但仍会收到错误消息。然而,Dallaylaen给了你几个更好的选择。@brian不,如果你只使用die,你将不会得到错误消息。好吧,你会死在你想要打印的消息中。你不需要警告。阅读模具上的文档。在做进一步的陈述之前,请先阅读任何内容的文档。