• Час читання ~2 хв
  • 18.04.2024

У нещодавньому випуску Laravel 11.4 Laravel з'явився Exceptions фасад, який додає зручності для встановлення винятків в обробнику винятків Laravel. До цього релізу я зазвичай використовував атрибут для $this->withoutExceptionHandling() твердження, що конкретний виняток стався під час HTTP-тесту:

use App\Exceptions\WelcomeException;

$this->withoutExceptionHandling();

try {
    $this->get('/');
} catch (WelcomeException $e) {
    $this->assertEquals('Woops, there was an issue with your request!', $e->getMessage());

    return;
}
$this->fail(sprintf('The expected "%s" exception was not thrown.', WelcomeException::class));

Коли ви очікуєте, що запит не генеруватиме жодних винятків, використання withoutExceptionHandling вирізає посередника, коли ви налагоджуєте, чому помилка відбувається, коли ви цього не очікуєте. Наведений вище код є нудним у написанні, оскільки він вручну фіксує виняток, робить твердження про виняток і викликає виклики return , щоб уникнути виклику вручну $this->fail() . Ручна помилка перехопить ситуації, коли тест не видасть виняток, коли це очікувано.

Якщо $this->fail() викликається у наведеному вище сценарії, ось як виглядатиме виведення:

$ phpunit
There was 1 failure:
1) Tests\Feature\ExampleTest::test_the_application_returns_a_successful_response
The expected "App\Exceptions\WelcomeException" exception was not thrown.
/app/tests/Feature/ExampleTest.php:33

Фасад

винятків Laravel Давайте подивимося, як новий Exceptions фасад може спростити наш тест; Перший приклад, переписаний, виглядатиме так:

use Illuminate\Support\Facades\Exceptions;

Exceptions::fake();

$this->get('/');

Exceptions::assertReported(function (WelcomeException $e): bool {
    return $e->getMessage() === "Woops, there was an issue with your request!";
});

Використання фасаду «Винятки» дає нам бонус у вигляді відсутності необхідності фіксувати виняток, щоб стверджувати речі вручну. Іншими словами, тест може утримувати обробник винятків Laravel на місці, але все одно мати можливість стверджувати винятки, які відбулися під час запиту.

Якщо ми хочемо бути впевнені, що тест не генерує конкретний виняток або не генерує жодних винятків, крапка, новий фасад підтримає нас:

Exceptions::assertNotReported(WelcomeException::class);

Exceptions::assertNothingReported();

Якщо тест дійсно повідомив про WelcomeException, результат тесту дасть нам гарно відформатоване повідомлення:

$ phpunit
There was 1 failure:
1) Tests\Feature\ExampleTest::test_the_application_returns_a_successful_response
The expected [App\Exceptions\WelcomeException] exception was not reported.

Хоча можуть бути випадки, коли ви не хочете підробляти обробник винятків Laravel, під час тестування крайніх випадків, новий фасад винятків надзвичайно корисний і очищає наш код:

Exceptions::assertReported(WelcomeException::class);
Exceptions::assertReportedCount($count);
Exceptions::assertNotReported(WelcomeException::class);
Exceptions::assertNothingReported();
Exceptions::throwFirstReported();

Щоб дізнатися більше про фасад винятків, перегляньте документацію Laravel.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297