2011-08-01 15 views
1

私は現在、単体テストを学んでいます。これを行うために、私は職場でスクリプトを書いています。スクリプト全体の単体テストを作成しています。これまでのことはうまくいっていますが、コマンドラインがヘルプメッセージをトリガするスクリプトフォームに入力された不正なデータをテストしようとしています。Try :: Tinyを使用してPerlスクリプトでpod2usage exitを「キャッチ」するにはどうすればよいですか?

私のコードのようなものになります。

sub getContext{ 
    my ($help) = @_; 

GetOptions(
    help|h => \$help, 
    ... 

pod2usage if $help; 
... 
} 

のように私のテストは何かを見て:

1..4 

ok 1 - use scripts::scriptname; 

ok 2 

ok 3 

# Looks like you planned 4 tests but ran 3. 

# Looks like your test exited with 1 just after 3. 

:私の出力が非常に似ています

my $help_exception = 0; 
try{ 
    getContext({help => 0}); 
}catch{ 
$help_exception = 1; 
} 

ok($help_exception, "Script died correctly when given help flag"); 

helpフラグのテストはtest 4です。Try :: Tiny try catchブロックをトリガーせずにスクリプトが終了しているようです。この問題を解決する方法はありますか、私はテストを別に書くべきですか?

答えて

4

Pod::Usageのドキュメントの-exitval引数はすべて一緒に終了するのを止める方法を示しています。あなたは単にそれを使用して、あなたのコードやテストを適切に適合させることができます。

それ以外の場合は、exitも例外ではないため、例外のようにトラップできません。ただし、CORE::GLOBAL::exitによって上書きされます。あなたの修正を適切にローカライズすることを前提に、それを使用することも合理的なアプローチです。

また、スクリプト全体を実行し、それに基づいてテストを行い、Pod::Usageexitという問題を完全に回避して、サブプロセスを開始することもできます。

あなたのテストでTry::Tinyを使用している方法はちょっと奇妙です。私は(これはTry::Tinyに基づいています)を使用すると、将来的にはより明確なテストができると思います。

+0

proveはご回答いただき、誠にありがとうございからCapture::Tiny

use warnings; use strict; use Capture::Tiny qw(capture); use Test::More; my $script = "/bin/ls"; plan skip_all => "Have no '$script' to check" unless -x $script; my ($out, $err) = capture { system($script, "-1", "/"); }; like($out, qr{^bin$}m, "$script finds bin"); ok(! $err, "...without error"); done_testing(2); 

出力を使用して、どのようにCORE :: GLOBAL :: EXITオーバーライドをローカライズするのでしょうか? – Moses

+0

'local'組み込み関数を使用しています。 – rafl

2

pod2usageexitであり、例外はスローされません。私はそれがこのように捕らえられるとは思わない。

テストでスクリプト全体を呼び出して、戻り値/出力をチェックするのが期待通りではないのはなぜですか?

1

回答:プログラム/スクリプトは再利用可能な部品/ユニットで構成されていないため、本当にユニットテスト可能ではありません。全体的にテストする必要があります。コマンドライン引数で実行し、出力とエラーを確認してください。例えば、–

/home/apv/ab .. 
ok 1 - /bin/ls finds bin 
ok 2 - ...without error 
1..2 
ok 
All tests successful. 
+0

私はスクリプトをテストするためにモジュロ方法を使用していました。これは、私が書いている種類のスクリプト(データベースアクセス、設定ファイルへのアクセスなど)に必要な私のテストでモックを使うことを可能にします。 http://www252.pair.com/comdog/mastering_perl/Chapters/18.modulinos.html – Moses

関連する問題