Модульное тестирование классов - это исключение ошибок? - PullRequest
2 голосов
/ 09 марта 2010

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

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

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

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

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

Я прав?

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

Ответы [ 4 ]

7 голосов
/ 09 марта 2010

Из руководства PHPUnit :

По умолчанию PHPUnit преобразует ошибки PHP, предупреждения и уведомления, которые срабатывают во время выполнения теста, в исключение. Используя эти исключения, вы можете, например, ожидать, что тест вызовет ошибку PHP, как показано в примере 4.8.

class ExpectedErrorTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException PHPUnit_Framework_Error
     */
    public function testFailingInclude()
    {
        include 'not_existing_file.php';
    }
}

То же самое работает для исключений, конечно.

Редактировать: не видел, это уже упоминалось в комментариях, но я оставлю это здесь для справки, если кто-то ищет тот же вопрос и не читает комментарии

2 голосов
/ 06 декабря 2011

Если вы хотите отменить обработку предупреждения как исключения, используйте PHPUnit_Framework_Error_Warning::$enabled=false;.

1 голос
/ 09 марта 2010

Не могли бы вы определить обработчик ошибок (через set_error_handler), который будет обрабатывать любую ошибку, которая не может быть обработана PHPUnit (например, E_USER_ERROR), как сбой модульного теста? 1005 *

(Вдохновлено тестами WordPress )

1 голос
/ 09 марта 2010

Я не знаю деталей вашей реализации, но вы не можете вызвать нормальное (настраиваемое) исключение (которое можно протестировать) и иметь в своем приложении глобальный обработчик исключений, который будет генерировать правильный E_USER_ERROR на основе этих (пользовательские) исключения?

Проверьте set_exception_handler для получения дополнительной информации о настройке этого глобального обработчика исключений.

...