13

私はPerlモジュールを作成しており、carpを使用して、致命的ではない警告を呼び出し元のプログラムに返しています。

鯉の警告は正常に機能します-入力パラメーターが特定の条件を満たしているかどうかを確認しています-条件を満たさない場合、警告が鯉とともに送信され、モジュールは呼び出し元のプログラムではなく、パラメーターのデフォルトを使用し続けます合格した。警告は、渡されたパラメータの代わりにデフォルトのパラメータが使用されていることを通知するためのものです。

私の問題は私のテストスクリプトにあります。テストスクリプトがモジュールに不正なパラメータを送信しています。戻ってきた警告メッセージをキャッチして、正しい警告メッセージが表示されたことを確認しようとしています。

私のモジュールは次のようになります。

else {
  carp "value must be numeric - using default value";
}

私のテストスクリプトは次のようになります。

eval {
  #call to my module
};
like (
    $@,
    qr/value must be numeric/,
    "Should abort on non-numeric value"
);

テストを実行すると、画面に警告(STDERRに送信される必要があります)が表示されますが、$@変数の内容は''-空白です。

これが私のテストスクリプトからの出力です:

t/04bad_method_calls....ok 10/12value must be numeric - using default value at ...
#   Failed test 'Should abort on non-numeric value'
#   at t/04bad_method_calls.t line 98.
t/04bad_method_calls....NOK 12
#                   '' doesn't match '(?-xism:value must be numeric)'
# Looks like you failed 1 test of 12.

コイを鳴き声に変更すると、テストスクリプトが機能します。エラーメッセージが表示されます(ただし、警告するだけで、中止することはできません)。

正直なところ、私はevalを最もよく理解していません。おそらく、それはコイからの警告出力をキャッチするための最良の方法ではありません。$ SIG {__ WARN__}を使用してみましたが、それも空でした。

コイからの出力をキャプチャする方法はありますか?これは私のテストスクリプトに含まれているため、これは最大の問題ではありませんが、テストスクリプトを正しく機能させたいと考えています。

前もって感謝します!

4

3 に答える 3

20

このページhttp://perldoc.perl.org/perlvar.html$SIG{__WARN__}から、テスト スクリプトの警告を致命的なエラーに変えるサブルーチンに local を設定したいようです。彼らが与える例は次のとおりです。

local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;
于 2009-01-27T15:00:44.217 に答える
7

STDERR警告とすべての出力をキャッチする別の方法:

my $stderr = '';
{
    local *STDERR;
    open STDERR, '>', \$stderr;
    do_stuf_here();
}
like( $stderr, qr/my result/, 'test stderr output' );

凝ったテスト関数を作ることができます:

sub stderr_test (&$$) {
    my ( $code, $pattern, $text ) = @_;
    my $result = '';
    {
        local *STDERR;
        open STDERR, '>', \$result;
        $code->();
    }
    if ( UNIVERSAL::isa( $pattern, 'Regexp' ) ) {
        like( $result, $pattern, $text );
    }
    else {
        is( $result, $pattern, $text );
    }
}

# usage
stderr_test {do_stuf_here} qr/my expected STDERR output/,
    'stderr is like';
stderr_test {do_stuf_here} 'my expected STDERR output',
    'stderr is exactly';
于 2009-01-27T16:06:23.943 に答える
6

テストスクリプトからこれを行う場合は、出力をキャプチャするTest::*モジュールを使用できます。私はTest::Outputが好きな傾向があります。

于 2009-01-27T18:09:01.467 に答える