Любое утверждение можно превратить в проверку на истинность:
<?php
public testCapitalize()
{
$this->assertTrue('Hello' == capitalize('hello'));
}
Но тогда пострадает вывод. Отлаживать такие проверки значительно сложнее чем специализированные проверки, заточенные под конкретную ситуацию. PHPUnit поставляется с большим числом готовых утверждений, часть из которых используется достаточно часто. Здесь мы рассмотрим некоторые из них.
<?php
// Проверяет количество элементов
$this->assertCount(0, ['foo']);
// Ожидает пустой массив
$this->assertEmpty(['foo']); // или assertNotEmpty
// При сравнении приводит к одному виду
// В случае массивов сортирует их
$this->assertEqualsCanonicalizing($arr1, $arr2);
// Проверяет что элемент слева входит в массив справа
$this->assertContains(4, [1, 2, 3]);
<?php
// Проверяет окончание строки
$this->assertStringEndsWith('suffix', 'foo');
// Проверяет что строка соответствует формату
// Варианты форматирования указаны в документации PHPUnit
$this->assertStringMatchesFormat('%i', 'foo');
// Проверяет наличие подстроки в строке
$this->assertStringContainsString('foo', 'bar');
Иногда результат работы кода доступен только как вывод в консоль. В таком случае не существует никакого возврата значения из функции, которое можно сравнить с ожидаемым. Для таких ситуаций в PHPUnit есть несколько специализированных утверждений. Они перехватывают вывод (STDOUT) и дают возможность проверить его:
<?php
public function testSomeCode(): void
{
// вызывается какой-то код, который печатает на экран
echo 'some output';
$this->expectOutputString('some output');
}
expectOutputString()
проверяет точное соответствие, что не всегда удобно. Если хочется проверить только часть вывода, то можно воспользоваться другим способом:
<?php
public function testSomeCode(): void
{
// вызывается какой-то код, который печатает на экран
echo 'some long output';
// Сюда передается регулярное выражение
$this->expectOutputRegexp('output');
}
Обработка ошибочных ситуаций это тоже логика, которую нужно программировать и тестировать. Когда что-то идет не так, вызываемый код может выбрасывать исключения:
<?php
throw new Exception('something went wrong');
Исключения не работают как возврат из функций. Вместо этого, они "поднимаются" наверх по стеку вызовов до тех пор пока их не "перехватят". Поэтому в PHPUnit для работы с исключениями используется специальное утверждение expectException()
:
<?php
public function testSomeCode(): void
{
// Сюда передается имя класса ожидаемого исключения
$this->expectException(Exception::class);
// тут вызов кода который должен бросить исключение
}
Очень важно вызывать expectException()
до кода, который бросает исключение. Когда исключение брошено, весь код который идет после него не вызывается.
Это далеко не все утверждения, которые есть в PHPUnit. Более того, PHPUnit достаточно гибкий и может расширяться собственными проверками. В целом, вам придётся постоянно заглядывать в документацию, чтобы вспомнить, что там есть. Это нормально.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт