对 PHP 错误进行测试
最后更新于:2022-04-01 03:44:33
# 对 PHP 错误进行测试
默认情况下,PHPUnit 将测试在执行中触发的 PHP 错误、警告、通知都转换为异常。利用这些异常,就可以,比如说,预期测试将触发 PHP 错误,如[Example 2.14, “用 @expectedException 来预期 PHP 错误”](# "Example 2.14. 用 @expectedException 来预期 PHP 错误")所示。
>[info] ### Note
> PHP 的 `error_reporting` 运行时配置会对 PHPUnit 将哪些错误转换为异常有所限制。如果在这个特性上碰到问题,请确认 PHP 的配置中没有抑制想要测试的错误类型。
**Example 2.14. 用 @expectedException 来预期 PHP 错误**
~~~
<?php
class ExpectedErrorTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException PHPUnit_Framework_Error
*/
public function testFailingInclude()
{
include 'not_existing_file.php';
}
}
?>
~~~
~~~
phpunit -d error_reporting=2 ExpectedErrorTest
PHPUnit 5.0.0 by Sebastian Bergmann and contributors.
.
Time: 0 seconds, Memory: 5.25Mb
OK (1 test, 1 assertion)
~~~
`PHPUnit_Framework_Error_Notice` 和 `PHPUnit_Framework_Error_Warning` 分别代表 PHP 通知与 PHP 警告。
>[info] ### Note
> 对异常进行测试是越明确越好的。对太笼统的类进行测试有可能导致不良副作用。因此,不再允许用 `@expectedException` 或 `setExpectedException()` 对 `Exception` 类进行测试。
如果测试依靠会触发错误的 PHP 函数,例如 `fopen` ,有时候在测试中使用错误抑制符会很有用。通过抑制住错误通知,就能对返回值进行检查,否则错误通知将会导致抛出 `PHPUnit_Framework_Error_Notice`。
**Example 2.15. 对会引发PHP 错误的代码的返回值进行测试**
~~~
<?php
class ErrorSuppressionTest extends PHPUnit_Framework_TestCase
{
public function testFileWriting() {
$writer = new FileWriter;
$this->assertFalse(@$writer->write('/is-not-writeable/file', 'stuff'));
}
}
class FileWriter
{
public function write($file, $content) {
$file = fopen($file, 'w');
if($file == false) {
return false;
}
// ...
}
}
?>
~~~
~~~
phpunit ErrorSuppressionTest
PHPUnit 5.0.0 by Sebastian Bergmann and contributors.
.
Time: 1 seconds, Memory: 5.25Mb
OK (1 test, 1 assertion)
~~~
如果不使用错误抑制符,此测试将会失败,并报告 ~~~
fopen(/is-not-writeable/file): failed to open stream: No such file or directory
~~~。