Niedawne wydanie Laravela 11.4 wprowadziło fasadę Exceptions
, która dodaje udogodnienia związane z potwierdzaniem wyjątków w programie obsługi wyjątków Laravela. Przed tą wersją zwykle używałem $this->withoutExceptionHandling()
do stwierdzenia, że określony wyjątek wystąpił podczas testu 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));
Gdy oczekujesz, że żądanie nie zgłosi żadnych wyjątków, użycie withoutExceptionHandling
wycina pośrednika podczas debugowania, dlaczego błąd występuje, gdy się go nie spodziewasz. Powyższy kod jest żmudny do napisania, ponieważ ręcznie przechwytuje wyjątek, wykonuje asercje dotyczące wyjątku i wywołuje w return
celu uniknięcia ręcznego $this->fail()
wywołania. Błąd ręczny przechwyci sytuacje, w których test nie zgłasza wyjątku zgodnie z oczekiwaniami.
Jeśli $this->fail()
zostanie wywołana w powyższym scenariuszu, oto jak będą wyglądać dane wyjściowe:
$ 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
Fasada
wyjątków Laravela Przyjrzyjmy się, w jaki sposób nowa Exceptions
fasada może uprościć nasz test; pierwszy przykład, przepisany, wyglądałby następująco:
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!";
});
Użycie fasady wyjątków daje nam bonus w postaci braku konieczności przechwytywania wyjątku w celu ręcznego potwierdzania rzeczy. Innymi słowy, test może utrzymać procedurę obsługi wyjątków Laravela na miejscu, ale nadal być w stanie potwierdzić wyjątki, które wystąpiły podczas żądania.
Jeśli chcemy mieć pewność, że test nie zgłasza konkretnego wyjątku lub nie zgłasza żadnych wyjątków, kropka, nowa fasada nas wspiera
Exceptions::assertNotReported(WelcomeException::class);
Exceptions::assertNothingReported();
:Jeśli test faktycznie zgłosił WelcomeException
, wynik testu dałby nam ładnie sformatowany komunikat:
$ 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.
Chociaż może się zdarzyć, że nie chcesz sfałszować obsługi wyjątków Laravela, podczas testowania skrajnych przypadków nowa fasada wyjątków jest niezwykle pomocna i oczyszcza nasz kod:
Exceptions::assertReported(WelcomeException::class);
Exceptions::assertReportedCount($count);
Exceptions::assertNotReported(WelcomeException::class);
Exceptions::assertNothingReported();
Exceptions::throwFirstReported();
Aby dowiedzieć się więcej o fasadzie wyjątków, zapoznaj się z dokumentacją Laravela.