Frage

Ich möchte einen Test mit SimpleTest schreiben, der fehlschlagen würde, wenn die von mir getestete Methode zu einem PHP führt E_NOTICE "undefinierter Index :bla".

Ich habe es versucht expectError() und expectException() ohne Erfolg.Die SimpleTest-Webseite zeigt an, dass SimpleTest PHP-Fehler bei der Kompilierung nicht abfangen kann, aber E_NOTICE scheint ein Laufzeitfehler zu sein.

Gibt es eine Möglichkeit, einen solchen Fehler abzufangen und meinen Test in diesem Fall fehlschlagen zu lassen?

War es hilfreich?

Lösung

Das war nicht ganz einfach, aber ich habe es endlich geschafft, die E_NOTICE fehler, den ich wollte.Ich musste den Strom außer Kraft setzen error_handler um eine Ausnahme zu werfen, die ich in einem fangen werde try{} Anweisung.

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

Dies scheint etwas zu kompliziert zu sein, wenn der Fehlerbehandler neu deklariert werden muss, um eine Ausnahme auszulösen, nur um sie abzufangen.Der andere schwierige Teil bestand darin, den error_handler korrekt wiederherzustellen, sowohl wenn eine Ausnahme abgefangen wurde als auch wenn kein Fehler aufgetreten ist.

Andere Tipps

Es ist wirklich nicht nötig, den Benachrichtigungsfehler abzufangen.Man könnte auch das Ergebnis von 'array_key_exists' testen und dann von dort aus fortfahren.

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

Testen Sie auf falsch und lassen Sie es fehlschlagen.

Sie werden es nie innerhalb des try-catch-Blocks abfangen, zum Glück haben wir set_error_handler():

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

Sie können in der Funktion my_handle () alles tun, was Sie wollen, oder sie einfach leer lassen, um den Hinweis zum Schweigen zu bringen, obwohl dies nicht empfohlen wird.Ein normaler Handler sollte so sein:

function myErrorHandler($errno, $errstr, $errfile, $errline)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top