Тесты модуляции PHP: можно ли проверить Fatal Error?
FWIW Я использую SimpleTest 1.1alpha.
У меня есть одноэлементный класс, и я хочу написать unit test, который гарантирует, что класс является singleton, пытаясь создать экземпляр класса (у него есть частный конструктор).
Это, очевидно, вызывает Fatal Error:
Неустранимая ошибка: вызов частного FrontController:: __ construct()
Есть ли способ "поймать" эту Fatal Error и сообщить о пройденном тесте?
Ответы
Ответ 1
Нет. Неустранимая ошибка останавливает выполнение script.
И это не обязательно, чтобы протестировать синглтон таким образом. Если вы настаиваете на проверке того, является ли конструктор закрытым, вы можете использовать ReflectionClass: getConstructor()
public function testCannotInstantiateExternally()
{
$reflection = new \ReflectionClass('\My\Namespace\MyClassName');
$constructor = $reflection->getConstructor();
$this->assertFalse($constructor->isPublic());
}
Еще одна вещь, которую следует учитывать, заключается в том, что классы/объекты Singleton являются препятствием в TTD, поскольку их сложно издеваться.
Ответ 2
Здесь полный фрагмент кода Mchl отвечает так, что людям не нужно проходить через документы...
public function testCannotInstantiateExternally()
{
$reflection = new \ReflectionClass('\My\Namespace\MyClassName');
$constructor = $reflection->getConstructor();
$this->assertFalse($constructor->isPublic());
}
Ответ 3
Вы можете использовать концепцию, такую как изоляция процесса PHPUnit.
Это означает, что тестовый код будет выполнен в подпроцессе php. В этом примере показано, как это может работать.
<?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);