どのように私はPerlで鯉からの出力をキャッチすることができますか?
質問
私はPerlモジュールを書いています、と私は戻って呼び出しプログラムに致命的でない警告をスローするように鯉を使用しています。
鯉の警告が正常に動作します - それは条件を満たしていない場合は、警告が鯉に送信され、モジュールは、パラメータのデフォルトの代わりの1を使用して続けている - 入力パラメータが所定の条件を満たした場合、私はチェックしています呼び出し側のプログラムは、渡されました。警告は単にデフォルトのパラメータが使用代わりのパラメータに渡されていることを通知することです。
私の問題は私のテストスクリプトです。私のテストスクリプトは、モジュールに悪いパラメータで送信している、と私は戻ってくる警告メッセージをキャッチし、私は正しい警告メッセージが表示されましたことを確認しようとしています。
私のモジュールは、次のようになります
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}を使用してみましたが、それは同様に空であった。
鯉からの出力をキャプチャする方法はありますか?これはちょうど私のテストスクリプトであるため、それが最大の問題ではないのですが、私はまだ私のテストスクリプトが正しく動作するために取得したいと思います。
事前に感謝します!
解決
このページから、 http://perldoc.perl.org/perlvar.html に、あなたは、テストスクリプトのために致命的なエラーに警告を向けるだろうサブルーチンにローカル$SIG{__WARN__}
を設定したいように見えます。彼らが与える例があります:
local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;
他のヒント
警告をキャッチし、また、すべてのSTERR
出力する方法を別の方法:
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';
、あなたはあなたのためのテスト:: *モジュールのキャプチャ出力を使用することができます。私はテスト::出力を好む傾向がある。