Frage

FWIW Ich verwende simpleetest 1.1alpha.

Ich habe eine Singleton -Klasse und möchte einen Unit -Test schreiben, der garantiert, dass die Klasse ein Singleton ist, indem er versucht, die Klasse zu instanziieren (sie hat einen privaten Konstruktor).

Dies verursacht offensichtlich einen tödlichen Fehler:

Tödlicher Fehler: Rufen Sie an private Frontcontroller :: __ construct () an

Gibt es eine Möglichkeit, diesen tödlichen Fehler zu "fangen" und einen bestandenen Test melden?

War es hilfreich?

Lösung

Nr. Fatal Fehler stoppt die Ausführung des Skripts.

Und es ist nicht wirklich notwendig, einen Singleton auf diese Weise zu testen. Wenn Sie auf der Überprüfung bestehen, ob der Konstruktor privat ist, können Sie verwenden ReflectionClass: getConstructor ()

public function testCannotInstantiateExternally()
{
    $reflection = new \ReflectionClass('\My\Namespace\MyClassName');
    $constructor = $reflection->getConstructor();
    $this->assertFalse($constructor->isPublic());
}

Eine andere Sache zu berücksichtigen ist, dass Singleton -Klassen/-objekte ein Hindernis in TTD sind, da sie schwer zu verspotten sind.

Andere Tipps

Hier ist ein kompletter Code -Ausschnitt von Mchls Antwort, damit die Leute die Dokumente nicht durchgehen müssen ...

public function testCannotInstantiateExternally()
{
    $reflection = new \ReflectionClass('\My\Namespace\MyClassName');
    $constructor = $reflection->getConstructor();
    $this->assertFalse($constructor->isPublic());
}

Sie können ein Konzept wie die Prozessisolation von Phpunit verwenden.

Dies bedeutet, dass der Testcode in einem Sub -Prozess von PHP ausgeführt wird. Dieses Beispiel zeigt, wie dies funktionieren könnte.

<?php

// get the test code as string
$testcode = '<?php new '; // will cause a syntax error

// put it in a temporary file
$testfile = tmpfile();
file_put_contents($testfile, $testcode);

exec("php $tempfile", $output, $return_value);

// now you can process the scripts return value and output
// in case of an syntax error the return value is 255
switch($return_value) {
    case 0 :
        echo 'PASSED';
        break;
    default :
        echo 'FAILED ' . $output;

}

// clean up
unlink($testfile);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top