PHPUnit 10 또는 11을 사용하여 예외를 발생시키는 코드를 테스트하는 대체 방법을 제공합니다. 주요 이점은 추가 검사를 위해 발생된 예외에 액세스할 수 있다는 것입니다. 이는 PHPUnit에서 예상할 수 없는 예외의 세부 정보를 확인해야 할 때 유용할 수 있습니다. 아래 예는 빠른 시작 역할을 합니다. 자세한 내용은 아래 세부 가이드를 확인하세요.
<?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는 이 패키지를 설치하는 데 지원되는 유일한 방법입니다.
composer require --dev cspray/assert-throws
PHPUnit은 기본적으로 예상되는 예외를 테스트하는 합리적인 방법을 제공합니다. 대부분의 상황에서는 PHPUnit에서 제공하는 메서드로 충분합니다. 그러나 PHPUnit에서 쉽게 사용할 수 없는 방식으로 예외 발생 코드를 테스트해야 하는 시나리오가 있습니다. 이에 대한 예로는 이전 예외를 테스트하려는 코드나 예외에 도메인별 정보가 포함되어 있는 경우가 있습니다. 이러한 상황에 이 라이브러리가 가장 적합합니다.
이 라이브러리에서 제공하는 모든 어설션은 예외가 발생할 것으로 예상되는 콜러블을 사용합니다. 예외가 발생하지 않으면 PHPUnitFrameworkExpectationFailedException
발생하여 테스트가 실패하게 됩니다. 그렇지 않으면 추가 어설션에 대해 던져진 예외가 반환됩니다.
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 '
);
정적 메서드가 있는 ThrowableAssert
클래스 외에도 사용 가능한 전역 함수가 있습니다.
<?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 '
);
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 '
);
}
}
어떤 방법을 사용하는지는 개인 취향입니다. 궁극적으로 모든 예제는 ThrowableAssert
클래스에서 사용 가능한 정적 메서드를 활용합니다.