4

いくつかの単体テストを実行していて、テストしているメソッド(またはスクリプトや関数など)が正常に失敗するかどうかを確認したいとします。このようなテストをどのように設定しますか?私はこのようなものを望んでいます:

ok( $obj->method($my, $bad, $params) == DEATH, 'method dies as expected');

method diesが不正なパラメータを渡され、テストスクリプトが停止した ため、どのように機能するかはわかりませんが。

別の方法はありますか?

4

3 に答える 3

5

Test :: Exceptionを試しましたか? dies_okあなたがやりたいことをする必要があります。例えば:

# Check that something died - we do not care why
dies_ok { $foo->method } 'expecting to die';
于 2010-12-23T19:04:41.833 に答える
5

Test::ExceptionではなくTest::Fatalをお勧めします。

Test :: Exceptionは長い間存在していたため、既存のテストスイートの多くがそれを使用していますが、Test::Fatalの方が習得が容易です。Test :: Fatalは1つの関数のみをエクスポートします:exception。これにより、関連付けられたコードが実行され、スローされた例外、またはエラーなしで実行された場合の例外が返されundefます。次に、通常のTest :: More関数(、、、、、などis)を使用してその戻り値をテストisntlikeますisa_ok

throws_okTest :: Exceptionでは、やなどの独自のテスト関数を学習する必要がありますdies_ok。また、コードとテスト名の間にコンマを入れないように注意してください。

したがって、あなたの例は次のようになります。

use Test::More;
use Test::Fatal;

my $obj = ...;

isnt(exception { $obj->method($my, $bad, $params) },
     undef, 'method dies as expected');

likeまたは、予期されるエラーメッセージを照合するため、またはisa_ok例外オブジェクトの正しいクラスをスローしたかどうかをテストするために使用できます。

Test :: Fatalは、Test::Exceptionよりも少ない学習曲線で柔軟性を提供します。

于 2010-12-23T20:18:07.910 に答える
1

これを行うためにモジュールを使用する必要は実際にはありません。次のように、失敗すると予想される呼び出しをevalブロックでラップすることができます。

ok !eval {$obj->method($my, $bad, $params); 1}, 'method dies as expected';

ですべてがうまくいけばeval、最後に実行されたステートメントが返され1ます。この場合はそうです。失敗した場合は、evalを返しundefます。これは必要なものの反対なokので!、値を反転します。

次に、必要に応じて、実際の例外メッセージをチェックして、その行をたどることができます。

like $@, qr/invalid argument/, 'method died with invalid argument';
于 2010-12-24T04:23:17.393 に答える