Question

Je voudrais écrire un test en utilisant simpleTest qui échouerait si la méthode que je teste aboutit à un PHP E_NOTICE "index indéfini :foo".

J'ai essayé expectError() et expectException() sans succès.La page Web simpleTest indique que simpleTest n'est pas capable de détecter les erreurs PHP au moment de la compilation, mais E_NOTICE semble être une erreur d'exécution.

Existe-t-il un moyen de détecter une telle erreur et de faire échouer mon test si c'est le cas ?

Était-ce utile?

La solution

Ce n'était pas vraiment facile mais j'ai finalement réussi à attraper le E_NOTICE erreur que je voulais.J'avais besoin de remplacer le courant error_handler lancer une exception que je vais attraper dans un try{} déclaration.

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

Cela semble un peu trop compliqué de devoir redéclarer le gestionnaire d'erreurs pour lever une exception juste pour l'attraper.L'autre partie difficile était de restaurer correctement le error_handler à la fois lorsqu'une exception était interceptée et qu'aucune erreur ne se produisait, sinon cela gâche simplement la gestion des erreurs SimpleTest.

Autres conseils

Il n'est vraiment pas nécessaire de détecter l'erreur de notification.On pourrait également tester le résultat de « array_key_exists » et ensuite procéder à partir de là.

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

Testez faux et faites-le échouer.

Vous ne l'attraperez jamais dans le bloc try-catch, heureusement nous avons set_error_handler() :

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

Vous pouvez faire tout ce que vous voulez dans la fonction my_handle(), ou simplement la laisser vide pour faire taire l'avis, bien que ce ne soit pas recommandé.Un gestionnaire normal devrait ressembler à ceci :

function myErrorHandler($errno, $errstr, $errfile, $errline)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top