假设您正在运行一些单元测试,并且您想查看您正在测试的方法(或脚本或函数或其他)是否按预期失败。你如何设置这样的测试?我希望这样的事情:
ok( $obj->method($my, $bad, $params) == DEATH, 'method dies as expected');
虽然我不知道它是如何工作的,因为method
die
s 当传递了错误的参数并且测试脚本停止时。
还有其他方法吗?
你试过Test::Exception吗? dies_ok
应该做你想做的。例如:
# Check that something died - we do not care why
dies_ok { $foo->method } 'expecting to die';
我推荐Test::Fatal而不是Test::Exception。
Test::Exception 已经存在很长时间了,所以很多现有的测试套件都在使用它,但是 Test::Fatal 更容易学习。Test::Fatal 仅导出 1 个函数:exception
. 这将运行关联的代码并返回它抛出的异常,或者undef
如果它运行没有错误。然后,您可以使用任何正常的Test::More函数(如is
、isnt
、like
或)来测试该返回值isa_ok
。
Test::Exception 要求你学习它自己的测试函数,比如throws_ok
and 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 更灵活,学习曲线更短。
确实不需要使用模块来执行此操作。您可以将预期失败的调用包装在一个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';