Как поймать "undefined index" Ошибка E_NOTICE в simpleTest?

Я хотел бы написать тест с использованием simpleTest, который потерпит неудачу, если метод, который я тестирую, приводит к индексу PHP E_NOTICE "undefined: foo".

Я пробовал expectError() и expectException() без успеха. Веб-страница simpleTest показывает, что simpleTest не может уловить ошибки PHP в компиляции, но E_NOTICE кажется ошибкой времени выполнения.

Есть ли способ поймать такую ​​ошибку и сделать мой тест, если это так?

Ответ 1

Это было не очень легко, но мне, наконец, удалось поймать ошибку 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.

Ответ 2

На самом деле нет необходимости улавливать ошибку уведомления. Можно также проверить результат "array_key_exists", а затем перейти оттуда.

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

Протестируйте значение false и не получилось.

Ответ 3

Вы никогда не поймаете его в блоке 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)