PHP: Продвинутое тестирование

Теория: Тестирование ошибок

Основные тесты, которые нужно писать, это тесты на успешные сценарии работы. Но в некоторых ситуациях код должен возвращать ошибки и их тоже бывает нужно проверять. Под ошибками понимаются ситуации, в которых код выбрасывает исключение. В чём их особенность? Посмотрите на тест:

<?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() для более точечного анализа перехваченного исключения.

Рекомендуемые программы