如何使用PHPUnit处理失败的PHP断言


How to handle a failed PHP assertion with PHPUnit?

我的代码中有一个断言。比如:

assert('is_string($var)');

如果我为PHPUnit编写一个测试,导致这个断言失败,并显示Warning: assert(): Assertion "is_string($var)" failed in /path/to/file.php on line ###

而且,我的测试也失败了。我已经尝试根据文档将@expectedException PHPUnit_Framework_Error_Warning添加到docblock,但这没有帮助。我需要做些什么才能使我的测试预期这个断言会失败?

From php.net/assert:

断言应该仅作为调试特性使用。您可以使用它们进行安全性检查,测试应该始终为TRUE的条件,如果不为TRUE则指示一些编程错误,或者检查某些功能(如扩展函数或某些系统限制和功能)的存在。

断言不应该用于正常的运行时操作,如输入参数检查。根据经验,如果没有激活断言检查,您的代码应该始终能够正确工作。

对于正常的代码逻辑,使用布尔值或一些预定义的常量。对于异常逻辑使用正常的if语句,对于无效输入抛出Exception

如果你真的热衷于保留断言,你可以定义一个assert回调,抛出一个Exception,你可以在PHPUnit中捕获。

// PHP 5.3 Anonymous function as callback
// code is untested
assert_options(ASSERT_CALLBACK, function($file, $line, $code) {
    throw new Exception('Assert failed in $file on line $line');
});

断言应该只在测试失败时才失败。