Come catturare un “undefined index” E_NOTICE errore in simpleTest?

Vorrei scrivere un test che utilizza simpleTest che verrebbe a mancare se il metodo che sto testando risultati in PHP E_NOTICE “undefined index : pippo”.

Ho provato expectError() e expectException() senza successo. Il simpleTest pagina web indicano che simpleTest non è in grado di catturare la compilazione di PHP errori, ma E_NOTICE sembra essere un errore di runtime.

C’è un modo per prendere un tale errore e rende il mio test non se è così ?

InformationsquelleAutor pixelastic | 2010-07-16

 

3 Replies
  1. 17

    Che non era davvero facile, ma sono finalmente riuscito a prendere il E_NOTICE errore che ho voluto. Avevo bisogno di sovrascrivere l’attuale error_handler per lanciare un’eccezione che mi cattura in un try{} istruzione.

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

    Questo sembra un po ‘ troppo complicato dover ridichiarare il gestore di errore per lanciare un’eccezione solo per prenderlo. L’altra parte più difficile è stata correttamente il ripristino del error_handler sia quando un’eccezione è rimasta chiusa e non si è verificato un errore, altrimenti è solo pasticci con SimpleTest la gestione degli errori.

    • Come terribile lingua!
    • Se si forniscono E_NOTICE come parametro 2 al set_error_handler solo di gestire le comunicazioni. “Può essere utilizzato per mascherare l’attivazione del error_handler funzionano proprio come il error_reporting ini impostazione controlla che gli errori sono visualizzati. Senza questa maschera impostare il error_handler sarà chiamata per ogni errore, a prescindere dalla loro impostazione l’impostazione error_reporting.”
  2. 5

    In realtà non c’è bisogno di prendere l’avviso di errore. Si potrebbe anche verificare il risultato dell’ ‘array_key_exists’ e procedere da lì.

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

    Test per falso e lo hanno esito negativo.

    • In caso di voto, si prega di spiegare perché.
    • C’è un caso quando si proietta un array in un altro array. Non si vuole di prova per ogni singola mappa, vuoi prendere il caso in cui uno qualsiasi dei mapping non riesce. Questo sarebbe molto più facile con le eccezioni.
  3. 0

    Che mai ti cattura all’interno del blocco try-catch, per fortuna abbiamo set_error_handler():

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

    Si può fare tutto quello che vuoi all’interno my_handle() la funzione, o semplicemente lasciare vuoto il silenzio, l’avviso, anche se, non è raccomandato. Un normale gestore dovrebbe essere come questo:

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

Lascia un commento