phpexceptionsimpletest

How to catch an "undefined index" E_NOTICE error in simpleTest?


I would like to write a test using simpleTest that would fail if the method I'm testing results in a PHP E_NOTICE "undefined index : foo".

I tried expectError() and expectException() without success. The simpleTest webpage indicate that simpleTest isn't able to catch compile time PHP errors, but E_NOTICE seems to be a run time error.

Is there a way to catch such an error and makes my test fail if so ?


Solution

  • That wasn't really easy but I finally managed to catch the E_NOTICE error I wanted. I needed to override the current error_handler to throw an exception that I will catch in a try{} statement.

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

    This seems a little overly complicated having to redeclare the error handler to throw an exception just to catch it. The other hard part was correctly restoring the error_handler both when an exception was catched and no error occured, otherwise it just messes with SimpleTest error handling.