• Время чтения ~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));

Когда вы ожидаете, что запрос не вызовет никаких исключений, using withoutExceptionHandling отключает посредника при отладке, почему ошибка происходит, когда вы ее не ожидаете. Приведенный выше код утомителен в написании, так как он вручную захватывает исключение, делает утверждения об исключении и вызывает return , чтобы избежать ручного $this->fail() вызова. Сбой, вызванный вручную, будет выявлять ситуации, когда тест не выдает исключение, когда ожидалось.

If $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!";
});

Использование фасада Exceptions дает нам бонус в виде отсутствия необходимости захватывать исключение для утверждения чего-либо вручную. Другими словами, тест может удерживать обработчик исключений 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 чрезвычайно полезен и очищает наш код:

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

Чтобы узнать больше о фасаде Exceptions, ознакомьтесь с документацией 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