Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 ?

like image 738
pixelastic Avatar asked Jul 16 '10 00:07

pixelastic


3 Answers

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.

like image 69
pixelastic Avatar answered Nov 13 '22 15:11

pixelastic


There really isn't a need to catch the notice error. One could also test the outcome of 'array_key_exists' and then proceed from there.

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

Test for false and have it fail.

like image 28
Robert Brisita Avatar answered Nov 13 '22 14:11

Robert Brisita


You'll never catch it within the try-catch block, luckily we have set_error_handler():

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

You can do anything you want inside my_handle() function, or just leave it empty to silence the notice, although, it's not recommended. A normal handler should be like this:

function myErrorHandler($errno, $errstr, $errfile, $errline)
like image 3
John Lee Avatar answered Nov 13 '22 16:11

John Lee