2010-07-16 3 views
15

테스트하는 메서드가 PHP E_NOTICE "정의되지 않은 인덱스 : foo"인 경우 실패하는 simpleTest를 사용하여 테스트를 작성하고 싶습니다.simpleTest에서 "정의되지 않은 색인"E_NOTICE 오류를 잡는 방법?

expectError()expectException()을 성공하지 못했습니다. simpleTest 웹 페이지는 simpleTest가 컴파일 타임 PHP 오류를 포착 할 수 없음을 나타내지 만 E_NOTICE은 런타임 오류 인 것 같습니다.

그런 오류를 잡을 수있는 방법이 있습니까? 그렇다면 내 테스트가 실패합니다.

답변

16

정말 쉬운 일은 아니지만 결국 나는 실수로 E_NOTICE 오류를 잡았습니다. 현재 error_handler을 무시하고 예외를 throw하여 try{} 문을 catch해야했습니다.

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(); 
} 

이것은 오류 처리기를 다시 선언해야만 예외를 잡아내어 잡는 데 약간 지나치게 복잡해 보입니다. 다른 어려운 부분은 예외가 catch되고 오류가 발생하지 않았을 때 error_handler를 올바르게 복원하고있었습니다. 그렇지 않으면 SimpleTest 오류 처리가 망가졌습니다.

+4

얼마나 끔찍한 언어입니까? – m93a

+0

E_NOTICE를 set_error_handler의 두 번째 매개 변수로 제공하면 알림 만 처리합니다. "error_reporting ini 설정이 표시되는 오류를 제어하는 ​​것처럼 _error_handler_ 함수의 트리거링을 마스크하는 데 사용할 수 있습니다.이 마스크 세트가 없으면 error_reporting 설정에 관계없이 모든 오류에 대해 _error_handler_가 호출됩니다." – nick

3

실제로 통지 오류를 포착 할 필요는 없습니다. 'array_key_exists'의 결과를 테스트 한 다음 거기에서부터 진행할 수도 있습니다.

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

거짓에 대한 테스트가 실패 할 수 있습니다.

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

당신은 당신이 my_handle() 함수 내에서 원하는 모든 것을 할 수있는, 아니면 그냥 침묵에 빈두고 :

+0

투표가 실패한 경우 이유를 설명하십시오. –

+2

배열을 다른 배열에 투영하는 경우가 있습니다. 각 개별지도를 테스트하고 싶지 않은 경우 매핑 중 하나가 실패하는 경우를 파악하고 싶습니다. 예외가 있으면 훨씬 쉬울 것입니다. – CMCDragonkai

0

당신은 시도 - catch 블록 내에서 그것을 잡을 수 없을거야, 다행히도 우리는() set_error_handler이 통지, 비록, 그것은 권장하지 않습니다. 정상적인 처리기는 다음과 같아야합니다.

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