我想使用 simpleTest 编写一个测试,如果我正在测试的方法导致 PHP E_NOTICE
“未定义索引:foo”,它将失败。
我试过了expectError()
,expectException()
但没有成功。simpleTest 网页表明 simpleTest 无法捕获编译时 PHP 错误,但E_NOTICE
似乎是运行时错误。
有没有办法捕捉到这样的错误并让我的测试失败?
我想使用 simpleTest 编写一个测试,如果我正在测试的方法导致 PHP E_NOTICE
“未定义索引:foo”,它将失败。
我试过了expectError()
,expectException()
但没有成功。simpleTest 网页表明 simpleTest 无法捕获编译时 PHP 错误,但E_NOTICE
似乎是运行时错误。
有没有办法捕捉到这样的错误并让我的测试失败?
这并不容易,但我终于设法抓住了E_NOTICE
我想要的错误。我需要重写 currenterror_handler
以引发我将在try{}
语句中捕获的异常。
function testGotUndefinedIndex() {
// Overriding the error handler
function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
// We are only interested in one kind of error
if ($errstr=='Undefined index: bar') {
//We throw an exception that will be catched in the test
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
return false;
}
set_error_handler("errorHandlerCatchUndefinedIndex");
try {
// triggering the error
$foo = array();
echo $foo['bar'];
} catch (ErrorException $e) {
// Very important : restoring the previous error handler
restore_error_handler();
// Manually asserting that the test fails
$this->fail();
return;
}
// Very important : restoring the previous error handler
restore_error_handler();
// Manually asserting that the test succeed
$this->pass();
}
这似乎有点过于复杂,不得不重新声明错误处理程序以抛出异常只是为了捕获它。另一个困难的部分是在捕获异常并且没有发生错误时正确恢复 error_handler,否则它只会与 SimpleTest 错误处理相混淆。
确实不需要捕获通知错误。还可以测试“array_key_exists”的结果,然后从那里继续。
http://www.php.net/manual/en/function.array-key-exists.php
测试 false 并让它失败。
你永远不会在 try-catch 块中捕获它,幸运的是我们有 set_error_handler():
<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>
您可以在 my_handle() 函数中做任何您想做的事情,或者将其留空以使通知静音,但不建议这样做。一个普通的处理程序应该是这样的:
function myErrorHandler($errno, $errstr, $errfile, $errline)
许多处理符号 E_NOTICE 错误的解决方案会忽略所有 E_NOTICE 错误。要忽略由于使用 at 符号而导致的错误,请在 set_error_handler 回调函数中执行此操作:
if (error_reporting()==0 && $errno==E_NOTICE)
return; // Ignore notices for at sign
不应忽略的重要 E_NOTICE 示例如下:
$a=$b;
因为 $b 是未定义的。