PHP-Unit-Tests: Ist es möglich zu testen, für einen Schwerwiegenden Fehler?
FWIW ich bin mit SimpleTest 1.1 alpha.
Habe ich eine singleton-Klasse, und ich möchte schreiben Sie einen unit test, der garantiert, dass die Klasse ein singleton ist, indem Sie versuchen, um die Klasse instanziieren (es hat einen privaten Konstruktor).
Dadurch natürlich ein Fataler Fehler:
Fatal error: Call to private FrontController::__construct()
Gibt es eine Möglichkeit, zu "fangen", die Fatal Error und berichten über eine bestandene Prüfung?
- Es gibt keine Einheit im Einfachen Test 😉
- Ich sehe das Wortspiel, aber ich verstehe es nicht.
- Vielleicht die Antwort kann es erklären
- Oldschool-unit-test-frameworks sind ungeeignet für das. Schreiben Sie eine PHPT für diesen test, und mischen Sie es in einer PHPUnit/SimpleTest Fall eine regex, die auf die Ausgabe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Fatal error Stoppt die Ausführung des Skripts.
Und es ist nicht wirklich notwendig, um zu testen, ein singleton in dieser Weise. Wenn Sie darauf bestehen, die Kontrolle, wenn der Konstruktor privat ist, können Sie ReflectionClass:getConstructor()
Andere Sache zu prüfen ist, dass die Singleton-Klassen/Objekte sind ein Hindernis in TTD, da Sie schwierig sind, zu verspotten.
Hier ist eine komplette code-snippet Mchl ' s Antwort, damit die Leute nicht haben, um durch zu gehen die docs...
Können Sie ein Konzept, wie PHPUnit, Prozess-isolation.
Dies bedeutet, dass der test-code wird ausgeführt in einem sub-Prozess von php. Dieses Beispiel zeigt, wie das funktionieren könnte.
php $tempfile
es ist besser ausführenphp --no-php-ini --syntax-check $tempfile
. php.net/manual/en/features.commandline.options.phpregister_shutdown_function('__phpunit_shutdown', $test, $result)
.__phpunit_shutdown($test, $result)
(im Fehlerfall) druckt nur ein serialisiertes array wie gewohnt, aber mit einem zusätzlichenerror
- key-sets zuerror_get_last()
. Dann können wir hinzufügen von Unterstützung für ein@expectedShutdownError <code>
ausPHPUnit_Util_PHP::runTestJob
, was Sie nennen würdeprocessChildResult
mit gefälschten Argumenten (vor allem stderr = ").@expectedShutdownError
müssten nun umgesetzt werden. Wir müssten Gabel PHPUnit um die änderung passieren (oder bin ich etwas fehlt?)PHPUnit_Util_PHP
und Ihre Nachkommen (..._Default
und..._Windows
) zu überschreibenrunTestJob
wie oben beschrieben. Dann, aus der TestCase-Klasse, wir würden überschreibenrun
so dass hier wir instanziieren können unsere Mittelklasse.