Юнит-тестирование классов - разве о выбросе ошибок не может быть и речи?



Я начинаю думать о PHPUnit и пытаюсь построить тестовый случай для существующего класса.



Класс является статическим классом конфигурации, получая, устанавливая и перечисляя параметры конфигурации, которые будут доступны в приложении.



Класс очень строго построен. Если я попытаюсь установить параметр конфигурации с несовместимым значением или параметр конфигурации, который не существует, будет брошен E_USER_ERROR, останавливающий выполнение сценария. Даже если это не тонкое искусство обработка ошибок, он прекрасно работает для целей этого класса. Ошибка в этом классе всегда является результатом ошибки программирования, и никогда плохого пользовательского ввода.

Это имеет большое преимущество, что вам не нужно беспокоиться о том, как обрабатываются или регистрируются сообщения об ошибках, что делает код тонким. Вывод сообщения (или нет, в производстве), die (), done.



Однако с помощью модульных тестов я не вижу, как я могу продолжать работать с классическими ошибками PHP. Мне придется преобразовать функции чтобы вернуть флаги успеха или создать исключения.



Я прав?



Или в PHPUnit есть способ ожидать ошибок, как и ожидать исключений? Я не вижу их сразу.

634   4  

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

    Ничего не найдено.