Нещодавно Pest додав throwsUnless()
метод у Pest v2.24 для умовної перевірки винятку, якщо заданий логічний вираз обчислюється як false.
Цей метод є аналогом методуthrowIf()
, який умовно перевіряє виняток, якщо заданий вираз істинний:
test('example 1', function () {
// Test that only throws an exception for the mysql driver...
})->throwsIf(DB::getDriverName() === 'mysql', Exception::class, 'MySQL is not supported.');
test('example 2', function () {
// Test that throws unless the db driver is mysql...
})->throwsUnless(DB::getDriverName() === 'mysql', SomeDBException::class);
Наприклад, припустимо, що у вас є пакет PHP, який підтримує різні розширення PHP для маніпулювання зображеннями. Ваше середовище CI може підтримувати та тестувати обидва gd
та imagemagick
; однак інші середовища можуть підтримувати лише одне або інше:Методи throwsIf()
and throwsUnless()
також підтримують виклики, якщо ви віддаєте перевагу цьому стилю або маєте якусь користувацьку логіку, яку ви хочете використовувати, щоб визначити, чи повинен тест генерувати виняток:
test('gd wrapper can create an image', function () {
$image = imagecreate(width: 200, height: 200);
imagecolorallocate($image, 255, 255, 255);
imagepng($image, '/tmp/new_image_gd.png');
expect(file_exists('/tmp/new_image_gd.png'))->toBeTrue();
})->throwsUnless(extension_loaded('gd'), \Error::class);
test('imagemagic wrapper can create an image', function () {
$image = new Imagick();
// ...
})->throwsUnless(extension_loaded('imagick'), \Error::class);
test('example test with callables', function () {
$image = new Imagick();
// ...
})->throwsUnless(fn () => class_exists(\Imagick::class), 'Class "Imagick" not found');
Дізнатися більше
Ви можете дізнатися про обробку винятків у тестах у документації Pest Exceptions. Крім того, якщо ви новачок у PestPHP і віддаєте перевагу відео, ми рекомендуємо ознайомитися з книгою Learn PestPHP з нуля від Люка Даунінга.