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::Fatal而不是Test::Exception

Test::Exception 已经存在很长时间了,所以很多现有的测试套件都在使用它,但是 Test::Fatal 更容易学习。Test::Fatal 仅导出 1 个函数:exception. 这将运行关联的代码并返回它抛出的异常,或者undef如果它运行没有错误。然后,您可以使用任何正常的Test::More函数(如isisntlike或)来测试该返回值isa_ok

Test::Exception 要求你学习它自己的测试函数,比如throws_okand 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 回答