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
クラスで使用できる静的メソッドを利用します。