Подтвердить что ты не робот

Тесты модуляции PHP: можно ли проверить Fatal Error?

FWIW Я использую SimpleTest 1.1alpha.

У меня есть одноэлементный класс, и я хочу написать unit test, который гарантирует, что класс является singleton, пытаясь создать экземпляр класса (у него есть частный конструктор).

Это, очевидно, вызывает Fatal Error:

Неустранимая ошибка: вызов частного FrontController:: __ construct()

Есть ли способ "поймать" эту Fatal Error и сообщить о пройденном тесте?

4b9b3361

Ответ 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);