Основные тесты, которые нужно писать, это тесты на успешные сценарии работы. Но в некоторых ситуациях код должен возвращать ошибки и их тоже бывает нужно проверять. Под ошибками понимаются ситуации, в которых код выбрасывает исключение. В чём их особенность? Посмотрите на тест:
<?php
class ExceptionTest extends TestCase
{
public function testException()
{
try {
functionWithException(0);
} catch (\Exception $e) {
$this->assertNotNull($e);
}
}
}
Этот код пытается протестировать ситуацию, при которой функция functionWithException()
выбрасывает исключение, если ей передать 0. Как вы думаете, этот тест проверит, что функция действительно порождает исключение? Правильный ответ – нет. Если функция functionWithException()
не выбросит исключение, то тест пройдёт, так как код не попадёт в блок catch
.
В PHPUnit есть утверждение, которое самостоятельно отлавливает исключение и проверяет, что оно вообще было сгенерировано.
<?php
class ExceptionTest extends TestCase
{
public function testException()
{
// Важно что ожидание ставится раньше вызова кода
$this->expectException(InvalidArgumentException::class);
functionWithException(0);
}
}
В дополнение к методу expectException()
существуют методы expectExceptionCode()
, expectExceptionMessage()
и expectExceptionMessageMatches()
для более точечного анализа перехваченного исключения.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.