一個函式庫,提供一組方便的斷言來測試 ReactPHP Promise。在幕後使用線索/php-block-react 來阻止承諾。
當測試非同步程式碼和 Promise 時,事情可能有點棘手。該函式庫提供了一組方便的斷言來測試 ReactPHP Promise。
目錄
安裝
快速入門
斷言
斷言PromiseFulfills()
斷言PromiseFulfillsWith()
斷言PromiseFulfillsWithInstanceOf()
斷言PromiseRejects()
斷言PromiseRejectsWith()
斷言TrueAboutPromise()
斷言FalseAboutPromise()
幫手
waitForPromiseToFulfill()
waitForPromise()
函式庫需要 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, ResponseInterfaceInterface: :班級); } }
使用特徵:
使用 PHPUnitFrameworkTestCase;使用 seregazhukReactPromiseTestingAssertsPromise;final class MyTest 擴充 TestCase {use AssertsPromise;/** @test */公用函數promise_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterfaceInterface: :班級); } }
上面的測試檢查ResponseInterface
實例是否符合指定的 Promise。
為了做出承諾斷言,我們需要運行循環。在每次測試之前,都會建立一個新的事件循環實例(在setUp()
方法內)。如果您需要循環來建立依賴項,您應該使用eventLoop()
方法來檢索它。
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
如果$promise
拒絕,則測試失敗。
您可以指定$timeout
以秒為單位來等待 Promise 解決。如果在指定的超時時間內未履行承諾,則測試失敗。如果未指定,則超時設定為 2 秒。
最終類別 PromiseFulfillsTest 擴展了 TestCase {/** @test */public function Promise_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:189 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills 未能斷言承諾已兌現。承諾被拒絕。
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
如果$promise
不滿足指定的$value
則測試失敗。
您可以指定$timeout
以秒為單位來等待承諾履行。如果在指定的超時時間內未履行承諾,則測試失敗。如果未指定,則超時設定為 2 秒。
最終類別 PromiseFulfillsWithTest 擴展了 TestCase {/** @test */public function Promise_fulfills_with_a_specified_value(): void{$deferred = new Deferred();$deferred->resolve(1234);$this->assertPromiseFulfillsWith($deferred->promise(), 1); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:180 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value 無法斷言 Promise 滿足指定值。 無法斷言 1234 與預期 1 相符。
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
如果$promise
無法滿足指定$class
的實例,則測試失敗。
您可以指定$timeout
以秒為單位來等待承諾履行。如果在指定的超時時間內未履行承諾,則測試失敗。如果未指定,則超時設定為 2 秒。
最終類別 PromiseFulfillsWithInstanceOfTest 擴展了 TestCase {/** @test */public function Promise_fulfills_with_an_instance_of_class(): void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($Class): :班級); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:180 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class 無法斷言 Promise 滿足類別 MyClass 的值。
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
如果$promise
滿足,則測試失敗。
您可以指定$timeout
以秒為單位來等待 Promise 解決。如果在指定的逾時時間內未履行承諾,則會拒絕ReactPromiseTimerTimeoutException
。如果未指定,則超時設定為 2 秒。
最終類別 PromiseRejectsTest 擴充了 TestCase {/** @test */public function Promise_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:175 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest::promise_rejects 未能斷言承諾拒絕。承諾兌現了。
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
如果$promise
沒有拒絕指定的異常類,則測試失敗。
您可以指定$timeout
以秒為單位來等待 Promise 解決。如果在指定的逾時時間內未履行承諾,則會拒絕ReactPromiseTimerTimeoutException
。如果未指定,則超時設定為 2 秒。
最終類別 PromiseRejectsWithTest 擴展了 TestCase {/** @test */公共函數promise_rejects_with_a_specified_reason(): void{$deferred = new Deferred();$deferred->reject(new LogicException());$this->assertPromiseRejectsWith(new LogicException());$this->assertPromiseRejectsWith(new LogicException());$this->assertPromiseRejectsWith($deferred)>promasserise($defise) InvalidArgumentException::class); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:136 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsPromiseRejectsWithTest::promise_rejects_with_a_specified_reason 未能斷言 Promise 因指定原因而拒絕。 無法斷言 LogicException 物件 (...) 是類別「InvalidArgumentException」的實例。
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
如果 Promise 中封裝的值不符合任意謂詞,則測試失敗。
您可以指定$timeout
以秒為單位來等待 Promise 解決。如果在指定的逾時時間內未履行承諾,則會拒絕ReactPromiseTimerTimeoutException
。如果未指定,則超時設定為 2 秒。
最終類別 AssertTrueAboutPromiseTest 擴展了 TestCase {/** @test */public function Promise_encapsulates_integer(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertTrueAboutPromise($deferred->promise(), function ($ val) {return is_object($val); }); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:136 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsAssertTrueAboutPromiseTest::promise_encapsulates_integer 未能斷言 false 為 true。
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
如果 Promise 中封裝的值符合任意謂詞,則測試失敗。
您可以指定$timeout
以秒為單位來等待 Promise 解決。如果在指定的逾時時間內未履行承諾,則會拒絕ReactPromiseTimerTimeoutException
。如果未指定,則超時設定為 2 秒。
最終類別 AssertFalseAboutPromiseTest 擴展了 TestCase {/** @test */public function Promise_encapsulates_object(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertFalseAboutPromise($deferred->promise(), function ($ val) {return is_int($val); }); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:136 毫秒,記憶體:4.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsAssertFalseAboutPromiseTest::promise_encapsulates_object 無法斷言 true 是 false。
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
。
當您想要解決承諾並取得解決值時,可以使用此幫助器。
嘗試在指定的$timeout
秒內解析$promise
並傳回解析值。如果未設定$timeout
,則預設使用2秒。如果$promise
沒有實現,測試就會失敗。
最終類別 WaitForPromiseToFulfillTest 擴展了 TestCase {/** @test */public function Promise_fulfills(): void{$deferred = new Deferred();$deferred->reject(new Exception());$value = $this->waitForPromiseToFulfill($deferred->promise ()); } }
PHPUnit 8.5.2 由 Sebastian Bergmann 和貢獻者編寫。 F 1 / 1 (100%) 時間:223 毫秒,記憶體:6.00MB 有1次失敗: 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills 未能兌現承諾。它被拒絕並出現異常。
function waitForPromise(PromiseInterface $promise, int $timeout = null)
。
嘗試在指定的$timeout
秒內解析指定的$promise
。如果未設定$timeout
,則預設使用2秒。如果承諾履行,則傳回解決值,否則拋出異常。如果 Promise 拒絕,則會拋出拒絕原因;如果 Promise 在指定的$timeout
內未實現,則會拋出ReactPromiseTimerTimeoutException
。
當您需要以同步方式從已履行的 Promise 中取得值時,此幫助器會很有用:
$value = $this->waitForPromise($cache->get('key'));