مكتبة توفر مجموعة من التأكيدات الملائمة لاختبار وعود ReactPHP. يستخدم تحت الغطاء فكرة/php-block-react لمنع الوعود.
عند اختبار التعليمات البرمجية والوعود غير المتزامنة، قد تكون الأمور صعبة بعض الشيء. توفر هذه المكتبة مجموعة من التأكيدات الملائمة لاختبار وعود ReactPHP.
جدول المحتويات
تثبيت
بداية سريعة
التأكيدات
تأكيدPromiseFulfills()
تأكيدPromiseFulfillsWith ()
AssurerPromiseFulfillsWithInstanceOf()
تأكيدPromiseRejects()
AssurerPromiseRejectsWith()
تأكيدTrueAboutPromise()
تأكيدFalseAboutPromise()
مساعدين
انتظرPromiseToFulfill()
انتظرالوعد ()
تتطلب المكتبة PHP 8.0 أو أعلى.
الطريقة الموصى بها لتثبيت هذه المكتبة هي عبر Composer. جديد للملحن؟
راجع أيضًا سجل التغيير للحصول على تفاصيل حول ترقيات الإصدار.
composer require seregazhuk/react-promise-testing --dev
استخدم السمة seregazhukReactPromiseTestingAssertsPromise
أو قم بتوسيع فئات الاختبار الخاصة بك من فئة seregazhukReactPromiseTestingTestCase
، والتي تعمل في حد ذاتها على توسيع PHPUnit TestCase
.
يمتد MyTest من الفئة النهائية إلى TestCase {/** @test */الوظيفة العامة Promise_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface: :فصل)؛ } }
باستخدام السمة:
استخدم PHPUnitFrameworkTestCase;استخدم seregazhukReactPromiseTestingAssertsPromise;الطبقة النهائية MyTest تمتد TestCase {استخدام AssertsPromise؛/** @test */ الوظيفة العامة وعد_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface: :فصل)؛ } }
يتحقق الاختبار أعلاه من استيفاء وعد محدد باستخدام مثيل ResponseInterface
.
لتقديم تأكيدات الوعد، نحتاج إلى تشغيل الحلقة. قبل كل اختبار، يتم إنشاء مثيل جديد لحلقة الحدث (داخل طريقة setUp()
). إذا كنت بحاجة إلى الحلقة لبناء تبعياتك، فيجب عليك استخدام طريقة eventLoop()
لاستعادتها.
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
يفشل الاختبار إذا تم رفض $promise
.
يمكنك تحديد $timeout
بالثواني لانتظار حل الوعد. إذا لم يتم الوفاء بالوعد في المهلة المحددة فسيفشل الاختبار. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
يمتد الفصل الأخير PromiseFulfillsTest إلى TestCase {/** @test */public function وعد_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 189 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills فشل التأكيد على أن الوعد يفي. تم رفض الوعد.
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
يفشل الاختبار إذا لم يفي $promise
$value
محددة.
يمكنك تحديد $timeout
بالثواني لانتظار الوفاء بالوعد. إذا لم يتم الوفاء بالوعد في المهلة المحددة فسيفشل الاختبار. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
يمتد الفصل الأخير PromiseFulfillsWithTest إلى TestCase {/** @test */public function وعد_fulfills_with_a_specified_value(): void{$deferred = new Deferred();$deferred->resolve(1234);$this->assertPromiseFulfillsWith($deferred->promise(), 1); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 180 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value فشل التأكيد على استيفاء الوعد بقيمة محددة. فشل التأكيد على أن 1234 مطابقة متوقعة 1.
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
يفشل الاختبار إذا لم يفي $promise
بمثيل $class
.
يمكنك تحديد $timeout
بالثواني لانتظار الوفاء بالوعد. إذا لم يتم الوفاء بالوعد في المهلة المحددة فسيفشل الاختبار. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
الطبقة النهائية PromiseFulfillsWithInstanceOfTest تمتد إلى TestCase {/** @test */public function وعد_fulfills_with_an_instance_of_class(): void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass: :فصل)؛ } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 180 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class فشل التأكيد على استيفاء الوعد بقيمة فئة MyClass.
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
يفشل الاختبار إذا تم الوفاء $promise
.
يمكنك تحديد $timeout
بالثواني لانتظار حل الوعد. إذا لم يتم الوفاء بالوعد خلال المهلة المحددة، فسيتم رفضه باستخدام ReactPromiseTimerTimeoutException
. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
يمتد الفصل الأخير PromiseRejectsTest إلى TestCase {/** @test */public function وعد_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 175 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest::promise_rejects فشل التأكيد على أن الوعد يرفض. تم الوفاء بالوعد.
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
يفشل الاختبار إذا لم يتم رفض $promise
بفئة استثناء محددة.
يمكنك تحديد $timeout
بالثواني لانتظار حل الوعد. إذا لم يتم الوفاء بالوعد خلال المهلة المحددة، فسيتم رفضه باستخدام ReactPromiseTimerTimeoutException
. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
يمتد الفصل الأخير PromiseRejectsWithTest إلى TestCase {/** @test */public function وعد_rejects_with_a_specified_reason(): void{$deferred = new Deferred();$deferred->reject(new LogicException());$this->assertPromiseRejectsWith($deferred->promise(), InvalidArgumentException::class); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 136 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsPromiseRejectsWithTest::promise_rejects_with_a_specified_reason فشل التأكيد على رفض الوعد لسبب محدد. فشل التأكيد على أن كائن LogicException (...) هو مثيل للفئة "InvalidArgumentException".
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
يفشل الاختبار إذا كانت القيمة المضمنة في الوعد لا تتوافق مع المسند التعسفي.
يمكنك تحديد $timeout
بالثواني لانتظار حل الوعد. إذا لم يتم الوفاء بالوعد خلال المهلة المحددة، فسيتم رفضه باستخدام ReactPromiseTimerTimeoutException
. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
تعمل الطبقة النهائية AssertTrueAboutPromiseTest على توسيع TestCase {/** @test */public function وعد_encapsulates_integer(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertTrueAboutPromise($deferred->promise(), function ($ فال) {العودة is_object($val); }); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 136 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsAssertTrueAboutPromiseTest::promise_encapsulates_integer فشل التأكيد على أن الباطل صحيح.
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
يفشل الاختبار إذا كانت القيمة المغلفة في الوعد تتوافق مع مسند عشوائي.
يمكنك تحديد $timeout
بالثواني لانتظار حل الوعد. إذا لم يتم الوفاء بالوعد خلال المهلة المحددة، فسيتم رفضه باستخدام ReactPromiseTimerTimeoutException
. عندما لا يتم تحديده، يتم ضبط المهلة على ثانيتين.
تعمل الطبقة النهائية AssertFalseAboutPromiseTest على توسيع TestCase {/** @test */public function وعد_encapsulates_object(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertFalseAboutPromise($deferred->promise(), function ($ فال) {العودة is_int($val); }); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 136 مللي ثانية، الذاكرة: 4.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsAssertFalseAboutPromiseTest::promise_encapsulates_object فشل في التأكيد على أن الحق خطأ.
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
.
يمكن استخدام هذا المساعد عندما تريد حل وعد والحصول على قيمة القرار.
يحاول حل $promise
في ثواني $timeout
محددة وإرجاع القيمة التي تم حلها. إذا لم يتم تعيين $timeout
، فسيتم استخدام ثانيتين بشكل افتراضي. يفشل الاختبار إذا لم يتم الوفاء $promise
.
يمتد الفصل الأخير WaitForPromiseToFulfillTest إلى TestCase {/** @test */public function وعد_fulfills(): void{$deferred = new Deferred();$deferred->reject(new Exception());$value = $this->waitForPromiseToFulfill($deferred->promise ()); } }
PHPUnit 8.5.2 بواسطة سيباستيان بيرجمان والمساهمين. ف 1 / 1 (100%) الوقت: 223 مللي ثانية، الذاكرة: 6.00 ميجابايت كان هناك فشل واحد: 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills فشل في الوفاء بالوعد. تم رفضه بالاستثناء.
function waitForPromise(PromiseInterface $promise, int $timeout = null)
.
يحاول حل $promise
محدد في ثانية $timeout
محددة. إذا لم يتم تعيين $timeout
، فسيتم استخدام ثانيتين بشكل افتراضي. في حالة استيفاء الوعد، يتم إرجاع قيمة دقة، وإلا فسيتم طرح استثناء. إذا تم رفض الوعد، فسيتم طرح سبب الرفض، وإذا لم يتم الوفاء بالوعد خلال $timeout
محددة، فسيتم طرح ReactPromiseTimerTimeoutException
.
يمكن أن يكون هذا المساعد مفيدًا عندما تحتاج إلى الحصول على القيمة من الوعد الذي تم الوفاء به بطريقة متزامنة:
$value = $this->waitForPromise($cache->get('key'));