Fornece uma maneira alternativa de testar código que lança exceções usando PHPUnit 10 ou 11. O principal benefício é o acesso à exceção lançada para inspeção adicional. Isso pode ser útil quando você precisar verificar detalhes de uma exceção que não está disponível no PHPUnit. O exemplo abaixo funciona como um início rápido. Para mais detalhes, consulte o Guia detalhado abaixo.
<?php declare (strict_types= 1 );
use Cspray AssertThrows ThrowableAssert ;
use PHPUnit Framework TestCase ;
final class MyTest extends TestCase {
public function testExceptionPreviousInstanceOf () : void {
$ throwable = ThrowableAssert:: assertThrows (
static fn () => throw new RuntimeException (previous: new BadMethodCallException ())
);
self :: assertInstanceOf (BadMethodCallException::class, $ throwable -> getPrevious ());
}
}
Composer é o único método suportado para instalar este pacote.
composer require --dev cspray/assert-throws
O PHPUnit fornece uma maneira razoável de testar as exceções esperadas prontas para uso. Para a maioria das situações, os métodos fornecidos pelo PHPUnit devem ser suficientes. No entanto, existem cenários em que você pode precisar testar o código de lançamento de exceções de uma forma que não está prontamente disponível no PHPUnit. Exemplos disso incluem código onde você deseja testar a exceção anterior ou se a exceção inclui informações específicas do domínio. É nessas situações que esta biblioteca é mais apropriada.
Todas as asserções fornecidas por esta biblioteca recebem uma chamada que deve gerar uma exceção. Se uma exceção não for lançada, um PHPUnitFrameworkExpectationFailedException
será lançado, resultando em uma falha no teste. Caso contrário, a exceção lançada será retornada para asserções adicionais.
Os seguintes métodos estáticos estão disponíveis na classe CsprayAssertThrowsThrowableAssert
:
<?php
use Cspray AssertThrows ThrowableAssert ;
$ throwable = ThrowableAssert:: assertThrows ( static fn () => throw new RuntimeException ());
$ throwable = ThrowableAssert:: assertThrowsExceptionType (
static fn () => throw new BadMethodCallException (),
BadMethodCallException::class
);
$ throwable = ThrowableAssert:: assertThrowsExceptionTypeWithMessage (
static fn () => throw new RuntimeException ( ' My exception message ' ),
RuntimeException::class,
' My exception message '
);
Além da classe ThrowableAssert
com métodos estáticos, existem funções globais disponíveis:
<?php
use function Cspray AssertThrows assertThrows ;
use function Cspray AssertThrows assertThrowsExceptionType ;
use function Cspray AssertThrows assertThrowsExceptionTypeWithMessage ;
$ throwable = assertThrows ( static fn () => throw new RuntimeException ());
$ throwable = assertThrowsExceptionType (
static fn () => throw new BadMethodCallException (),
BadMethodCallException::class
);
$ throwable = assertThrowsExceptionTypeWithMessage (
static fn () => throw new RuntimeException ( ' My exception message ' ),
RuntimeException::class,
' My exception message '
);
Bem como uma característica para usar em suas implementações PHPUnitFrameworkTestCase
:
<?php
use Cspray AssertThrows ThrowableAssertTestCaseMethods ;
use PHPUnit Framework TestCase ;
class MyTestCase extends TestCase {
use ThrowableAssertTestCaseMethods;
public function testAssertThrows () : void {
$ throwable = self :: assertThrows ( static fn () => new RuntimeException ());
}
public function testAssertThrowsExceptionType () : void {
$ throwable = self :: assertThrowsExceptionType (
static fn () => throw new BadMethodCallException (),
BadMethodCallException::class
);
}
public function testAssertThrowsExceptionTypeWithMessage () : void {
$ throwable = self :: assertThrowsExceptionTypeWithMessage (
static fn () => throw new RuntimeException ( ' My exception message ' ),
RuntimeException::class,
' My exception message '
);
}
}
O método que você usa é uma preferência pessoal. Em última análise, todos os exemplos utilizam os métodos estáticos disponíveis na classe ThrowableAssert
.