一个库,提供一组方便的断言来测试 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, ResponseInterface: :班级); } }
使用特征:
使用 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, ResponseInterface: :班级); } }
上面的测试检查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($deferred->promise(), MyClass: :班级); } }
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($deferred->promise(), 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'));