在TAP中发出警告

时间:2011-06-04 19:14:02

标签: perl testing

我的代码测试了一个糟糕的API调用,幸运的是代码会导致模块本身发出警告。但是当我测试失败的API调用时,我希望在TAP中看不到警告。

t/01-pass.t .............. ok
t/02-fail.t .............. ok
t/03-noversion.t ......... ok
t/04-no-file.t ........... ok
Use of uninitialized value $file in concatenation (.) or string at /home/xenoterracide/projects/Test-Version/lib/Test/Version.pm line 29.
t/05-file-not-defined.t .. ok
# unsorted oks: 001
t/06-all.t ............... ok
All tests successful.
Files=6, Tests=37,  1 wallclock secs ( 0.04 usr  0.02 sys +  0.35 cusr  0.04 csys =  0.45 CPU)
Result: PASS

这是实际的代码

#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
use Test::Tester tests => 7;
use Test::Version qw( version_ok );

check_test(
    sub {
        version_ok; # correct call version_ok( $file )
    },
    {
        ok => 0,
        name => 'check version in ',
        diag => 'FILE_NOT_DEFINED',
    },
    '$file not defined'
);

有没有办法压制警告并防止它在TAP (原始模块中的no warnings之外)中结束。

3 个答案:

答案 0 :(得分:6)

您可能正在寻找Test::Warn。它易于使用:

use strict;
use warnings;
use Test::More;
use Test::Warn;
# You might also find the following modules interesting:
# use Test::Exception;
# use Test::NoWarnings;

sub bla { warn 'bla' }

warning_is { bla() } 'bla';
done_testing;

因此,您正在将警告从麻烦变为预期的事物。

如果这不是您想要的,请查看IO::CaptureOutput或 - depréférence,根据两个模块的作者David Golden - Capture::Tiny

您还可以手动编写所有代码,将STDERR重定向到缓冲区,直到您发出“发出警告”的调用。

答案 1 :(得分:4)

local $SIG{__WARN__} = sub {};

会暂时停止警告。

答案 2 :(得分:0)

要考虑的另一个与警告相关的模块是Test::NoWarnings。这会检查您的代码是否产生警告,否则将无法通过测试。您可以忽略已知的警告,例如OP,假设这是所需的行为(在$ work,我们忽略来自少数'嘈杂'CPAN模块的警告,例如PDF :: API2)。它可以

总的来说,我同意Schwern的意见,并尝试修复警告,而不是覆盖$SIG{__WARN__}覆盖。测试的主要好处之一是捕获其他代码更改时引入的错误 - 您的测试文件不只是检查您刚编写的代码是否正常,而是您编写的代码将来CPAN模块和其他应用程序的更新时仍然可以。