如何在simpleTest中捕获“未定义的索引”E_NOTICE错误?

时间:2010-07-16 00:18:03

标签: php exception simpletest

我想使用simpleTest编写测试,如果我正在测试的方法导致PHP E_NOTICE“未定义的索引:foo”,则会失败。

我尝试expectError()expectException()但没有成功。 simpleTest网页表明simpleTest无法捕获编译时PHP错误,但E_NOTICE似乎是运行时错误。

有没有办法捕获这样的错误并使我的测试失败呢?

4 个答案:

答案 0 :(得分:16)

这不是很容易,但我终于设法抓住了我想要的E_NOTICE错误。我需要覆盖当前的error_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错误处理。

答案 1 :(得分:6)

确实没有必要抓住通知错误。也可以测试'array_key_exists'的结果,然后从那里开始。

http://www.php.net/manual/en/function.array-key-exists.php

测试是否错误并使其失败。

答案 2 :(得分:0)

你永远不会在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)

答案 3 :(得分:0)

许多处理 at 符号 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 是未定义的。