假设您正在运行某些单元测试,并且您想要查看您正在测试的方法(或脚本或函数或其他)是否应该失败.你如何设置这样的测试?我希望这样的事情:
ok( $obj->method($my, $bad, $params) == DEATH, 'method dies as expected');
Run Code Online (Sandbox Code Playgroud)
虽然我没有看到它如何工作,因为method
die
传递坏参数和测试脚本停止.
还有另外一种方法吗?
你试过Test :: Exception吗? dies_ok
应该做你想做的事.例如:
# Check that something died - we do not care why
dies_ok { $foo->method } 'expecting to die';
Run Code Online (Sandbox Code Playgroud)
我推荐Test :: Fatal而不是Test :: Exception.
Test :: Exception已经存在了很长时间,因此很多现有的测试套件都使用它,但Test :: Fatal更容易学习.测试::致命导出只有1个功能:exception
.这将运行关联的代码并返回它抛出的异常,或者undef
它是否正常运行.然后,测试使用任何正常的是返回值测试::更多功能,如is
,isnt
,like
,或isa_ok
.
测试::例外要求您了解了自己的测试功能,如throws_ok
和dies_ok
,记住,你不把代码和测试名之间用逗号.
所以,你的例子是:
use Test::More;
use Test::Fatal;
my $obj = ...;
isnt(exception { $obj->method($my, $bad, $params) },
undef, 'method dies as expected');
Run Code Online (Sandbox Code Playgroud)
或者您可以使用like
匹配预期的错误消息,或isa_ok
测试它是否抛出了正确的异常对象类.
Test :: Fatal比Test :: Exception提供更多的灵活性,学习曲线更少.