• Czas czytania ~2 min
  • 18.04.2024

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.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297