Перевірка звітів про виключення в Laravel за допомогою `assertReported`

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 23 квітня, 2025
Вам цікаво, як Laravel спрощує тестування обробки виключень у ваших застосунках? У цій статті ми розглянемо метод assertReported, який дозволяє легко перевіряти, чи були виключення правильно зафіксовані та звітуються під час виконання тестів

Laravel спрощує тестування обробки виключень за допомогою методу assertReported фасаду Exceptions. Це надійний спосіб перевірити, що виключення коректно фіксуються та звітуються у ваших додатках.

Правильна обробка та звітування про виключення є основою надійних додатків. Проте перевірка цієї поведінки у тестах може бути складною без відповідних інструментів. Фасад Exceptions у Laravel пропонує рішення для цієї проблеми за допомогою методу assertReported, що дозволяє підтвердити, що конкретні виключення були зафіксовані під час виконання тестів.

Ось базова реалізація:

use Illuminate\Support\Facades\Exceptions;
 
test('перевірка коректності звітування про виключення', function () {
    Exceptions::fake();
 
    $this->post('/generate-document', [
        'force_error' => 'true',
    ])->assertStatus(503); // Служба недоступна
 
    Exceptions::assertReported(ServiceUnavailableException::class);
});

Метод assertReported дуже корисний при тестуванні складних кінцевих точок, де можуть виникати різні виключення залежно від умов:

use Illuminate\Support\Facades\Exceptions;
use App\Exceptions\ValidationException;
use App\Exceptions\ResourceNotFoundException;
 
test('операція створення підписки обробляє кілька типів виключень', function () {
    Exceptions::fake();
 
    // Тест на виключення валідації
    $this->postJson('/api/subscriptions', [
        'email' => 'invalid-email',
    ])->assertStatus(422);
 
    Exceptions::assertReported(ValidationException::class);
 
    // Тест на непідвладний ресурс
    $this->postJson('/api/subscriptions', [
        'plan_id' => 999,
    ])->assertStatus(404);
 
    Exceptions::assertReported(ResourceNotFoundException::class);
 
    // Перевірка деталей конкретного виключення
    Exceptions::assertReported(function (ResourceNotFoundException $exception) {
        return $exception->getMessage() === 'План підписки не знайдений' &&
               $exception->getCode() === 404;
    });
});

Цей метод пропонує два підходи до перевірки. Ви можете використовувати тести на основі класу, щоб підтвердити, що тип виключення було зафіксовано:

Exceptions::assertReported(ServiceUnavailableException::class);

Або використовувати зворотний виклик для перевірки конкретних властивостей виключення:

Exceptions::assertReported(function (ServiceUnavailableException $exception) {
    return $exception->getMessage() === 'Тайм-аут зовнішнього API';
});

Метод assertReported стає незамінним при тестуванні критично важливих робочих процесів, таких як платіжні системи, інтеграції з третіми сторонами або фонові завдання, де правильне звітування про виключення безпосередньо впливає на вашу здатність моніторити та налагоджувати проблеми у продуктивній системі