يوفر طريقة بديلة لاختبار التعليمات البرمجية التي تطرح استثناءات باستخدام 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 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
.