Модульные тесты PHP: возможно ли проверить на фатальную ошибку? - PullRequest
11 голосов
/ 21 января 2011

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

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

Это, очевидно, вызывает фатальную ошибку:

Фатальная ошибка: вызов приватного FrontController :: __ construct ()

Есть лиспособ "поймать" эту фатальную ошибку и сообщить о пройденном тесте?

Ответы [ 3 ]

12 голосов
/ 21 января 2011

Нет.Неустранимая ошибка останавливает выполнение скрипта.

И тестировать синглтон таким образом не обязательно.Если вы настаиваете на проверке, является ли конструктор закрытым, вы можете использовать ReflectionClass: getConstructor ()

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

Еще одна вещь, которую следует учитывать, это то, что классы / объекты Singleton являются препятствием в TTD, посколькутрудно издеваться.

5 голосов
/ 29 августа 2014

Вот полный фрагмент кода ответа Мчла, чтобы людям не приходилось просматривать документы ...

public function testCannotInstantiateExternally()
{
    $reflection = new \ReflectionClass('\My\Namespace\MyClassName');
    $constructor = $reflection->getConstructor();
    $this->assertFalse($constructor->isPublic());
}
3 голосов
/ 21 декабря 2012

Вы можете использовать такую ​​концепцию, как изоляция процессов в 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);
...