Как ожидать фатальных ошибок с помощью simpletest в php

Я пытаюсь написать тестовый пример, чтобы убедиться, что класс Singleton не может быть создан. Конструктор для Singleton определен как закрытый, поэтому мой тест выглядит следующим образом:

$this->expectError();
$test = new TestSingletonClassA();

Вместо того, чтобы поймать ошибку и пройти тест, я получаю «Неустранимая ошибка PHP: вызов приватного Singleton::__construct()». Я также пытался передать PatternExpectation в качестве параметра для expectError, но это тоже не сработало. У Вас есть какие-то предложения?

Некоторая предыстория: php5.3, simpletest1.1a


person jp.rider63    schedule 06.01.2011    source источник


Ответы (3)


Если ваш php-код выдает FATAL ERROR, он никогда не попадет в phpunit, поэтому вам нужно написать «правильный» код, чтобы протестировать его. Если вы вызовете частный метод, он выдаст исключение, поэтому он не попадет в phpunit. Вы должны изменить это.

Я думаю, вам нужно издеваться над объектом. Попробуйте эти сообщения на эту тему (это серия из 4 сообщений ) и эти слайды (из слайда № 43) .

person Jose Armesto    schedule 06.01.2011

Фреймворки модульного тестирования не могут улавливать такие вещи. Но вы можете это сделать с помощью PHPT и аналогичных сред регрессионного тестирования.

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

person mario    schedule 06.01.2011

я не думаю, что это возможно сделать таким образом ... фатальные ошибки не поддаются отлову, как я понял. вы можете использовать отражение, чтобы получить метод конструктора, а затем убедиться, что он имеет модификатор доступа "private".

это трудно проверить на большинстве языков. например, java, c# и c++ даже не позволят вам скомпилировать этот код. поэтому его вообще нельзя было запустить D:

person davogotland    schedule 06.01.2011
comment
Итак, я думаю, что в этой ситуации вместо тестовых случаев я должен сосредоточиться на правильном дизайне? В моей реализации Singleton является абстрактным классом, поэтому я хочу, чтобы подклассы не могли реализовать открытый конструктор, но могли переопределить частный конструктор. Есть ли способ сделать это? - person jp.rider63; 06.01.2011
comment
я так не думаю.. но есть другие способы убедиться, что конструктор не вызывается, когда он не должен. одним из способов было бы наличие массива, отслеживающего созданные классы. другой может использовать debug_stacktrace для проверки того, что стек вызовов исходит из некоторого метода get_instance. обе стратегии будут применяться внутри конструктора базового класса. Кроме того, я думаю, вам нужно сделать конструктор вашего базового класса защищенным, иначе конструктор подкласса, вероятно, не сможет вызвать parent::__construct - person davogotland; 07.01.2011