В недавнем выпуске 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.