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

2022-08-30 21:04:16

我想使用simpleTest编写一个测试,如果我正在测试的方法在PHP“未定义的索引:foo”中结果,它将失败。E_NOTICE

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

有没有办法抓住这样的错误,如果是,我的测试失败?


答案 1

这并不容易,但我终于设法抓住了我想要的错误。我需要重写当前数据以引发一个异常,我将在语句中捕获该异常。E_NOTICEerror_handlertry{}

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错误处理。


答案 2

真的没有必要捕获通知错误。人们还可以测试“array_key_exists”的结果,然后从那里开始。

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

测试 false 并让它失败。


推荐