Юнит-тестирование классов - разве о выбросе ошибок не может быть и речи?
Я начинаю думать о PHPUnit и пытаюсь построить тестовый случай для существующего класса.
Класс является статическим классом конфигурации, получая, устанавливая и перечисляя параметры конфигурации, которые будут доступны в приложении.
Класс очень строго построен. Если я попытаюсь установить параметр конфигурации с несовместимым значением или параметр конфигурации, который не существует, будет брошен
E_USER_ERROR, останавливающий выполнение сценария. Даже если это не тонкое искусство обработка ошибок, он прекрасно работает для целей этого класса. Ошибка в этом классе всегда является результатом ошибки программирования, и никогда плохого пользовательского ввода. Это имеет большое преимущество, что вам не нужно беспокоиться о том, как обрабатываются или регистрируются сообщения об ошибках, что делает код тонким. Вывод сообщения (или нет, в производстве), die (), done.
Однако с помощью модульных тестов я не вижу, как я могу продолжать работать с классическими ошибками PHP. Мне придется преобразовать функции чтобы вернуть флаги успеха или создать исключения.
Я прав?
Или в PHPUnit есть способ ожидать ошибок, как и ожидать исключений? Я не вижу их сразу.
4 ответов:
Из руководства PHPUnit :
По умолчанию PHPUnit преобразует ошибки PHP, предупреждения и уведомления, которые запускаются во время выполнения теста, в исключение. Используя эти исключения, вы можете, например, ожидать, что тест вызовет ошибку PHP, как показано в Примере 4.8.
class ExpectedErrorTest extends PHPUnit_Framework_TestCase { /** * @expectedException PHPUnit_Framework_Error */ public function testFailingInclude() { include 'not_existing_file.php'; } }То же самое работает для исключений, конечно.
Править: не видел, что это уже упоминалось в комментариях, но я оставлю его здесь для справки в случае, если кто-то ищет тот же вопрос и не читает комментарии
Если вы хотите отменить обработку предупреждения как исключения, используйте
PHPUnit_Framework_Error_Warning::$enabled=false;.
Я не знаю подробностей вашей реализации, но не могли бы вы создать обычное (пользовательское) исключение (которое можно протестировать) и иметь глобальный обработчик исключений в вашем приложении, который будет выдавать правильный E_USER_ERROR на основе этих (пользовательских) исключений?
Проверьте set_exception_handler для получения дополнительной информации о настройке этого глобального обработчика исключений.
Не могли бы вы определить обработчик ошибок (через
set_error_handler) это будет рассматривать любую ошибку, которая не может быть обработана PHPUnit (например,E_USER_ERROR), как сбой модульного теста?(Вдохновленный тестами WordPress)
Comments