seregazhuk/react-promise-testing
Composer 安装命令:
composer require --dev seregazhuk/react-promise-testing
包简介
PHPUnit-based library for testing ReactPHP promises
README 文档
README
A library that provides a set of convenient assertions for testing ReactPHP promises. Under the hood uses clue/php-block-react to block promises.
When testing asynchronous code and promises things can be a bit tricky. This library provides a set of convenient assertions for testing ReactPHP promises.
Table of Contents
Installation
Dependencies
Library requires PHP 8.0 or above.
The recommended way to install this library is via Composer. New to Composer?
See also the CHANGELOG for details about version upgrades.
composer require seregazhuk/react-promise-testing --dev
Quick Start
Use the trait seregazhuk\React\PromiseTesting\AssertsPromise or extend your
test classes from seregazhuk\React\PromiseTesting\TestCase class,
which itself extends PHPUnit TestCase.
final class MyTest extends TestCase { /** @test */ public function promise_fulfills_with_a_response_object() { $browser = new Clue\React\Buzz\Browser($this->eventLoop()); $promise = $browser->get('http://www.google.com/'); $this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface::class); } }
Using the trait:
use PHPUnit\Framework\TestCase; use seregazhuk\React\PromiseTesting\AssertsPromise; final class MyTest extends TestCase { use AssertsPromise; /** @test */ public function promise_fulfills_with_a_response_object() { $browser = new Clue\React\Buzz\Browser($this->eventLoop()); $promise = $browser->get('http://www.google.com/'); $this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface::class); } }
Test above checks that a specified promise fulfills with an instance of ResponseInterface.
Event loop
To make promise assertions we need to run the loop. Before each test a new instance of the event loop
is being created (inside setUp() method). If you need the loop to build your dependencies you should
use eventLoop() method to retrieve it.
Assertions
assertPromiseFulfills()
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
The test fails if the $promise rejects.
You can specify $timeout in seconds to wait for promise to be resolved.
If the promise was not fulfilled in specified timeout the test fails. When not specified, timeout is set to 2 seconds.
final class PromiseFulfillsTest extends TestCase { /** @test */ public function promise_fulfills(): void { $deferred = new Deferred(); $deferred->reject(); $this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 189 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\PromiseFulfillTest::promise_fulfills Failed asserting that promise fulfills. Promise was rejected.
assertPromiseFulfillsWith()
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
The test fails if the $promise doesn't fulfills with a specified $value.
You can specify $timeout in seconds to wait for promise to be fulfilled.
If the promise was not fulfilled in specified timeout the test fails.
When not specified, timeout is set to 2 seconds.
final class PromiseFulfillsWithTest extends 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 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 180 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\PromiseFulfillsWithTest::promise_fulfills_with_a_specified_value Failed asserting that promise fulfills with a specified value. Failed asserting that 1234 matches expected 1.
assertPromiseFulfillsWithInstanceOf()
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
The test fails if the $promise doesn't fulfills with an instance of specified $class.
You can specify $timeout in seconds to wait for promise to be fulfilled.
If the promise was not fulfilled in specified timeout the test fails.
When not specified, timeout is set to 2 seconds.
final class PromiseFulfillsWithInstanceOfTest extends TestCase { /** @test */ public function promise_fulfills_with_an_instance_of_class(): void { $deferred = new Deferred(); $deferred->resolve(new MyClass); $this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass::class); } }
PHPUnit 8.5.2 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 180 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\PromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class Failed asserting that promise fulfills with a value of class MyClass.
assertPromiseRejects()
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
The test fails if the $promise fulfills.
You can specify $timeout in seconds to wait for promise to be resolved.
If the promise was not fulfilled in specified timeout, it rejects with React\Promise\Timer\TimeoutException.
When not specified, timeout is set to 2 seconds.
final class PromiseRejectsTest extends TestCase { /** @test */ public function promise_rejects(): void { $deferred = new Deferred(); $deferred->resolve(); $this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 175 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\PromiseRejectsTest::promise_rejects Failed asserting that promise rejects. Promise was fulfilled.
assertPromiseRejectsWith()
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
The test fails if the $promise doesn't reject with a specified exception class.
You can specify $timeout in seconds to wait for promise to be resolved.
If the promise was not fulfilled in specified timeout, it rejects with React\Promise\Timer\TimeoutException.
When not specified, timeout is set to 2 seconds.
final class PromiseRejectsWithTest extends 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 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 136 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\PromiseRejectsWithTest::promise_rejects_with_a_specified_reason Failed asserting that promise rejects with a specified reason. Failed asserting that LogicException Object (...) is an instance of class "InvalidArgumentException".
assertTrueAboutPromise()
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
The test fails if the value encapsulated in the Promise does not conform to an arbitrary predicate.
You can specify $timeout in seconds to wait for promise to be resolved.
If the promise was not fulfilled in specified timeout, it rejects with React\Promise\Timer\TimeoutException.
When not specified, timeout is set to 2 seconds.
final class AssertTrueAboutPromiseTest extends 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 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 136 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\AssertTrueAboutPromiseTest::promise_encapsulates_integer Failed asserting that false is true.
assertFalseAboutPromise()
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
The test fails if the value encapsulated in the Promise conforms to an arbitrary predicate.
You can specify $timeout in seconds to wait for promise to be resolved.
If the promise was not fulfilled in specified timeout, it rejects with React\Promise\Timer\TimeoutException.
When not specified, timeout is set to 2 seconds.
final class AssertFalseAboutPromiseTest extends 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 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 136 ms, Memory: 4.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\AssertFalseAboutPromiseTest::promise_encapsulates_object Failed asserting that true is false.
Helpers
waitForPromiseToFulfill()
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null).
This helper can be used when you want to resolve a promise and get the resolution value.
Tries to resolve a $promise in a specified $timeout seconds and returns resolved value. If $timeout is not
set uses 2 seconds by default. The test fails if the $promise doesn't fulfill.
final class WaitForPromiseToFulfillTest extends TestCase { /** @test */ public function promise_fulfills(): void { $deferred = new Deferred(); $deferred->reject(new \Exception()); $value = $this->waitForPromiseToFulfill($deferred->promise()); } }
PHPUnit 8.5.2 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 223 ms, Memory: 6.00MB There was 1 failure: 1) seregazhuk\React\PromiseTesting\tests\WaitForPromiseToFulfillTest::promise_fulfills Failed to fulfill a promise. It was rejected with Exception.
waitForPromise()
function waitForPromise(PromiseInterface $promise, int $timeout = null).
Tries to resolve a specified $promise in a specified $timeout seconds. If $timeout is not set uses 2
seconds by default. If the promise fulfills returns a resolution value, otherwise throws an exception. If the
promise rejects throws the rejection reason, if the promise doesn't fulfill in a specified $timeout throws
React\Promise\Timer\TimeoutException.
This helper can be useful when you need to get the value from the fulfilled promise in a synchronous way:
$value = $this->waitForPromise($cache->get('key'));
seregazhuk/react-promise-testing 适用场景与选型建议
seregazhuk/react-promise-testing 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5.52k 次下载、GitHub Stars 达 32, 最近一次更新时间为 2017 年 11 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「testing」 「test」 「promise」 「reactphp」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 seregazhuk/react-promise-testing 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 seregazhuk/react-promise-testing 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 seregazhuk/react-promise-testing 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Testing Suite For Lumen like Laravel does.
Lightweight library that provides regular PHP methods is a non-blocking implementation.
Server side promises
Safely namespaced guzzle promises for WP2Static
Generic PHP Threads library using only pure PHP
Pleasantly work with asynchronous code.
统计信息
- 总下载量: 5.52k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 33
- 点击次数: 12
- 依赖项目数: 6
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-11-10