Молчать предупреждение в TAP - PullRequest
4 голосов
/ 04 июня 2011

Мой код имеет тест на плохой вызов 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 ]

6 голосов
/ 04 июня 2011

Возможно, вы ищете 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 или - préférence , по словам автора обоих модулей, Дэвида Голдена - на Capture :: Tiny .

Вы также можетезакодируйте все вручную, перенаправив STDERR в буфер на время выполнения вызова, который выдаст предупреждение.

4 голосов
/ 05 июня 2011
local $SIG{__WARN__} = sub {};

временно отключит предупреждения.

0 голосов
/ 06 июня 2011

Еще один модуль, связанный с предупреждением: Test :: NoWarnings . Это проверяет, что ваш код не выдает предупреждений, и провалит тест, если нет. Вы можете игнорировать известные предупреждения, такие как OP, предполагая, что это желаемое поведение (на $ work мы игнорируем предупреждения от нескольких «шумных» модулей CPAN, таких как PDF :: API2). Может

В целом, я бы согласился со Шверном и попытался бы исправить предупреждения, а не общий $SIG{__WARN__} переопределение. Одним из основных преимуществ тестов является обнаружение ошибок, возникающих при изменении другого кода - ваш тестовый файл не просто проверяет, что код, который вы только что написали, в порядке, но код, который вы написали, будет все еще будет хорошо в будущем, когда модули CPAN и остальная часть вашего приложения будут обновлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...