4

このテスト スクリプトを実行しました。

use strict;
use warnings;
use Test::More tests => 3;
use Carp;

ok(1<2);
pass();
fail();
croak "example";

コマンドラインを使用するprove -MCarp=verbose -v foo.plと、次のエラーが発生しました。

Subroutine App::Prove::verbose redefined at /opt/ActivePerl-5.12/lib/App/Prove.pm line 407
        App::Prove::_load_extension('App::Prove=HASH(0x683718)', 'Carp=verbose') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 419
        App::Prove::_load_extensions('App::Prove=HASH(0x683718)', 'ARRAY(0x683850)') called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 481
        App::Prove::run('App::Prove=HASH(0x683718)') called at /opt/ActivePerl-5.12/bin/prove line 11
Undefined subroutine &Carp::verbose called at /opt/ActivePerl-5.12/lib/App/Prove.pm line 484.

を使用して実行してperl -MCarp=verbose foo.plも問題ありません。prove詳細なCarpを拒否する原因は何ですか? croakにグローバルに置き換えcroakられていない場合、テストから完全なコールスタックを取得するにはどうすればよいconfessですか?

4

3 に答える 3

10

prove -Mと同等ではないようperl -Mです。モジュールをテストにロードするのではなく、証明拡張機能をロードするようです。ドキュメントはこの点で完全に不明確ですが、App::Prove のコードはそうではありません。Carp prove -MCarp=verbose::verbose を App::Prove にインポートすると、上記の問題が発生します。

必要なことを行う簡単な方法は、PERL5OPT 環境変数とCarp::Alwaysを使用することです。これにより、すべての警告とダイ (および鯉と鳴き声) がスタック トレースに変換されます。

PERL5OPT=-MCarp::Always prove ...

これには、証明の有無にかかわらず、あらゆる状況で機能するという追加の利点があります。

于 2010-08-31T01:38:58.993 に答える
3

証明はperlとは非常に異なるコマンドライン引数のセットを持ち、完全に異なるプログラムですか?

証明の -M は、プラグマを有効にすることを意図していると私は信じています。Carp は実際には verbose() サブルーチンへの前方参照をエクスポートしますが、これは証明の内部動作に干渉します。

次のような小さなモジュールを作成できます。

# Verbme.pm
use Carp;
$Carp::Verbose = 1;

そして証明からそれを有効にします:

prove -MVerbme -v foo.pl

けれど。

于 2010-08-31T01:37:52.950 に答える
2

CarpはExporter のEXPORT_FAILメカニズムを使用して to へのverbose「オプション」を処理しますがimport、これはかなり間違っています。残念ながら、動作するために依存する詳細なサブがあり、 -M オプションにより、インポートが 内で発生します。ここで誰が責任を負っているのかわかりません-このように(ab)使用したり、リストにあるものを削除しなかったためですが、一緒にそれを壊しています:)Exporter::Heavy*Carp::verbose*{"$callerpkg::verbose"}App::ProveApp::ProveCarpEXPORT_FAILExporter::Heavy@imports@failed

于 2010-08-31T01:43:37.343 に答える