ReactPHP Promise をテストするための便利なアサーションのセットを提供するライブラリ。内部では、clude/php-block-react を使用して Promise をブロックします。
非同期コードと Promise をテストする場合、少し注意が必要になることがあります。このライブラリは、ReactPHP Promise をテストするための便利なアサーションのセットを提供します。
目次
インストール
クイックスタート
アサーション
assertPromiseFulfills()
assertPromiseFulfillsWith()
assertPromiseFulfillsWithInstanceOf()
assertPromiseRejects()
assertPromiseRejectsWith()
assertTrueAboutPromise()
assertFalseAboutPromise()
ヘルパー
waitForPromiseToFulfill()
waitForPromise()
ライブラリには PHP 8.0 以降が必要です。
このライブラリをインストールする推奨方法は、Composer を使用することです。作曲家は初めてですか?
バージョンアップの詳細については、CHANGELOG も参照してください。
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 を拡張します。 {Use AssertsPromise;/** @test */public function Promise_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface: :クラス); } }
上記のテストでは、指定された Promise がResponseInterface
のインスタンスで満たされるかどうかを確認します。
Promise アサーションを行うには、ループを実行する必要があります。各テストの前に、イベント ループの新しいインスタンスが作成されます ( setUp()
メソッド内)。依存関係を構築するためにループが必要な場合は、 eventLoop()
メソッドを使用してループを取得する必要があります。
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
$promise
が拒否した場合、テストは失敗します。
$timeout
秒単位で指定して、Promise が解決されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、テストは失敗します。指定しない場合、タイムアウトは 2 秒に設定されます。
最終クラス PromiseFulfillsTest は TestCase を拡張します {/** @test */public functionpromise_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 (Sebastian Bergmann および寄稿者による)。 F1/1(100%) 時間:189ms、メモリ:4.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills 約束が果たされると主張できませんでした。約束は拒否されました。
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
$promise
が指定された$value
を満たさない場合、テストは失敗します。
$timeout
秒単位で指定して、Promise が履行されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、テストは失敗します。指定しない場合、タイムアウトは 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 および寄稿者による)。 F1/1(100%) 時間:180ms、メモリ:4.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value 指定された値で Promise が満たされるかどうかのアサートに失敗しました。 1234 が予期された 1 と一致するというアサートに失敗しました。
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
指定された$class
のインスタンスで$promise
満たされない場合、テストは失敗します。
$timeout
秒単位で指定して、Promise が履行されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、テストは失敗します。指定しない場合、タイムアウトは 2 秒に設定されます。
最終クラス PromiseFulfillsWithInstanceOfTest は TestCase を拡張します {/** @test */public function Promise_fulfills_with_an_instance_of_class(): void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass: :クラス); } }
PHPUnit 8.5.2 (Sebastian Bergmann および寄稿者による)。 F1/1(100%) 時間:180ms、メモリ:4.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class Promise がクラス MyClass の値で満たされることのアサートに失敗しました。
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
$promise
が満たされる場合、テストは失敗します。
$timeout
秒単位で指定して、Promise が解決されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、 ReactPromiseTimerTimeoutException
で拒否されます。指定しない場合、タイムアウトは 2 秒に設定されます。
最終クラス PromiseRejectsTest は TestCase を拡張します {/** @test */public functionpromise_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 (Sebastian Bergmann および寄稿者による)。 F1/1(100%) 時間:175ms、メモリ:4.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest::promise_rejects Promise が拒否されたことを表明できませんでした。約束は果たされました。
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
$promise
指定された例外クラスで拒否しない場合、テストは失敗します。
$timeout
秒単位で指定して、Promise が解決されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、 ReactPromiseTimerTimeoutException
で拒否されます。指定しない場合、タイムアウトは 2 秒に設定されます。
最終クラス PromiseRejectsWithTest は TestCase を拡張します {/** @test */public function Promise_rejects_with_a_specified_reason(): void{$deferred = new Deferred();$deferred->reject(new LogicException());$this->assertPromiseRejectsWith($deferred->promise(), InvalidArgumentException::class); } }
PHPUnit 8.5.2 (Sebastian Bergmann および寄稿者による)。 F1/1(100%) 時間:136ms、メモリ: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 が解決されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、 ReactPromiseTimerTimeoutException
で拒否されます。指定しない場合、タイムアウトは 2 秒に設定されます。
最終クラス AssertTrueAboutPromiseTest は TestCase を拡張します {/** @test */public functionpromise_encapsulates_integer(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertTrueAboutPromise($deferred->promise(), function ($ val) {戻り値 is_object($val); }); } }
PHPUnit 8.5.2 (Sebastian Bergmann および寄稿者による)。 F1/1(100%) 時間:136ms、メモリ:4.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsAssertTrueAboutPromiseTest::promise_encapsulates_integer false が true であるとのアサートに失敗しました。
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Promise にカプセル化された値が任意の述語に一致する場合、テストは失敗します。
$timeout
秒単位で指定して、Promise が解決されるまで待機できます。指定されたタイムアウト内に Promise が履行されなかった場合、 ReactPromiseTimerTimeoutException
で拒否されます。指定しない場合、タイムアウトは 2 秒に設定されます。
最終クラス AssertFalseAboutPromiseTest は TestCase を拡張します {/** @test */public functionpromise_encapsulates_object(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertFalseAboutPromise($deferred->promise(), function ($ val) {戻り値 is_int($val); }); } }
PHPUnit 8.5.2 (Sebastian Bergmann および寄稿者による)。 F1/1(100%) 時間:136ms、メモリ:4.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsAssertFalseAboutPromiseTest::promise_encapsulates_object true が false であるとのアサートに失敗しました。
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
。
このヘルパーは、Promise を解決して解決値を取得する場合に使用できます。
指定された$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 および寄稿者による)。 F1/1(100%) 時間:223ms、メモリ:6.00MB 失敗が 1 つありました: 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills 約束を果たせなかった。例外で拒否されました。
function waitForPromise(PromiseInterface $promise, int $timeout = null)
。
指定された$promise
指定された$timeout
秒内に解決しようとします。 $timeout
が設定されていない場合、デフォルトでは 2 秒が使用されます。 Promise が満たされる場合は解決値が返され、そうでない場合は例外がスローされます。 Promise が拒否された場合は拒否理由がスローされ、Promise が指定された$timeout
内に満たされない場合はReactPromiseTimerTimeoutException
がスローされます。
このヘルパーは、履行された Promise から同期的な方法で値を取得する必要がある場合に役立ちます。
$value = $this->waitForPromise($cache->get('key'));