2010-07-16 4 views
15

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

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

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

ответ

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.

+4

Как ужасный язык! – m93a

+0

Если вы предоставили E_NOTICE в качестве второго параметра set_error_handler, он будет обрабатывать только уведомления. «Может использоваться для маскировки запуска функции _error_handler_, как и для параметров установки параметров error_reporting ini, в которых отображаются ошибки. Без этой маски установка _error_handler_ будет вызываться для каждой ошибки независимо от установки параметра error_reporting." – nick

3

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

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

Тест на ложь и он не в состоянии.

+0

Если вы голосовали, объясните, почему. –

+2

Существует случай, когда вы проектируете массив в другой массив. Вы не хотите проверять каждую отдельную карту, вы хотите поймать случай, когда какое-либо из изображений не выполняется. С исключениями это было бы намного проще. – CMCDragonkai

0

Вы никогда не поймать его в блоке примерки поймать, к счастью, у нас есть set_error_handler():

<?php 
function my_handle(){} 
set_error_handler("my_handle"); 
echo $foo["bar"]; 
?> 

Вы можете сделать все, что вы хотите внутри my_handle() функции, или просто оставить его пустым, чтобы заставить замолчать уведомление, хотя, это не рекомендуется. Нормальный обработчик должен быть таким:

function myErrorHandler($errno, $errstr, $errfile, $errline)