Библиотека, предоставляющая набор удобных утверждений для тестирования обещаний ReactPHP. Под капотом используется ключ/php-block-react для блокировки обещаний.
При тестировании асинхронного кода и промисов все может быть немного сложнее. Эта библиотека предоставляет набор удобных утверждений для тестирования обещаний ReactPHP.
Оглавление
Установка
Быстрый старт
Утверждения
AssertPromiseFulfills()
AssertPromiseFulfillsWith()
AssertPromiseFulfillsWithInstanceOf()
УтверждатьПромисеРежектс()
AssertPromiseRejectsWith()
утверждатьTrueAboutPromise()
утверждатьFalseAboutPromise()
Помощники
waitForPromiseToFulfill()
waitForPromise()
Для библиотеки требуется PHP 8.0 или выше.
Рекомендуемый способ установки этой библиотеки — через Composer. Впервые в Composer?
См. также CHANGELOG для получения подробной информации об обновлениях версий.
composer require seregazhuk/react-promise-testing --dev
Используйте признак seregazhukReactPromiseTestingAssertsPromise
или расширяйте свои тестовые классы из класса seregazhukReactPromiseTestingTestCase
, который сам расширяет PHPUnit TestCase
.
последний класс MyTest расширяет TestCase {/** @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: :сорт); } }
Используя черту:
использовать 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: :сорт); } }
Приведенный выше тест проверяет, что указанное обещание выполняется с помощью экземпляра ResponseInterface
.
Чтобы сделать утверждения обещания, нам нужно запустить цикл. Перед каждым тестом создается новый экземпляр цикла событий (внутри метода setUp()
). Если вам нужен цикл для построения зависимостей, вам следует использовать метод eventLoop()
для его получения.
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
Тест не пройден, если $promise
отклоняется.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено за указанный таймаут, тест не пройден. Если не указано, тайм-аут устанавливается равным 2 секундам.
последний класс PromiseFulfillsTest расширяет TestCase {/** @test */public function Promise_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 от Себастьяна Бергманна и его участников. Ф 1/1 (100%) Время: 189 мс, Память: 4,00 МБ Был 1 сбой: 1) серегажукReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills Не удалось подтвердить выполнение обещания. Обещание было отклонено.
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
Тест не пройден, если $promise
не выполняется с указанным $value
.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено за указанный таймаут, тест не пройден. Если не указано, тайм-аут устанавливается равным 2 секундам.
последний класс 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 сбой: 1) серегажукReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value Не удалось подтвердить выполнение обещания с указанным значением. Не удалось подтвердить, что ожидается 1234 совпадения 1.
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
Тест не пройден, если $promise
не выполняется с экземпляром указанного $class
.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено за указанный таймаут, тест не пройден. Если не указано, тайм-аут устанавливается равным 2 секундам.
последний класс 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 сбой: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class Не удалось подтвердить выполнение обещания со значением класса MyClass.
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
Тест не пройден, если $promise
выполнен.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено в течение указанного времени ожидания, оно отклоняется с помощью ReactPromiseTimerTimeoutException
. Если не указано, тайм-аут устанавливается равным 2 секундам.
последний класс PromiseRejectsTest расширяет TestCase {/** @test */public function Promise_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 от Себастьяна Бергманна и его участников. Ф 1/1 (100%) Время: 175 мс, Память: 4,00 МБ Был 1 сбой: 1) серегажукReactPromiseTestingtestsPromiseRejectsTest::promise_rejects Не удалось подтвердить, что обещание отклонено. Обещание было выполнено.
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
Тест не пройден, если $promise
не отклоняется с указанным классом исключений.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено в течение указанного времени ожидания, оно отклоняется с помощью ReactPromiseTimerTimeoutException
. Если не указано, тайм-аут устанавливается равным 2 секундам.
последний класс 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 сбой: 1) серегажукReactPromiseTestingtestsPromiseRejectsWithTest::promise_rejects_with_a_specified_reason Не удалось подтвердить, что обещание отклонено по указанной причине. Не удалось подтвердить, что объект LogicException (...) является экземпляром класса InvalidArgumentException.
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Тест не пройден, если значение, инкапсулированное в обещание, не соответствует произвольному предикату.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено в течение указанного времени ожидания, оно отклоняется с помощью 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 от Себастьяна Бергманна и его участников. Ф 1/1 (100%) Время: 136 мс, Память: 4,00 МБ Был 1 сбой: 1) серегажукReactPromiseTestingtestsAssertTrueAboutPromiseTest::promise_encapsulates_integer Не удалось доказать, что ложь является правдой.
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Тест не пройден, если значение, инкапсулированное в обещание, соответствует произвольному предикату.
Вы можете указать $timeout
в секундах, чтобы дождаться выполнения обещания. Если обещание не было выполнено в течение указанного времени ожидания, оно отклоняется с помощью 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 от Себастьяна Бергманна и его участников. Ф 1/1 (100%) Время: 136 мс, Память: 4,00 МБ Был 1 сбой: 1) серегажукReactPromiseTestingtestsAssertFalseAboutPromiseTest::promise_encapsulates_object Не удалось доказать, что истинное является ложным.
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
.
Этот помощник можно использовать, когда вы хотите разрешить обещание и получить значение разрешения.
Пытается выполнить $promise
за указанное $timeout
секунд и возвращает решенное значение. Если $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 от Себастьяна Бергманна и его участников. Ф 1/1 (100%) Время: 223 мс, Память: 6,00 МБ Был 1 сбой: 1) серегажукReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills Не удалось выполнить обещание. Оно было отклонено с исключением.
function waitForPromise(PromiseInterface $promise, int $timeout = null)
.
Пытается выполнить указанное $promise
за указанное $timeout
секунд. Если $timeout
не установлен, по умолчанию используется 2 секунды. Если обещание выполнено, возвращается значение разрешения, в противном случае выдается исключение. Если обещание отклоняется, выдается причина отклонения, если обещание не выполняется в течение указанного $timeout
выдается исключение ReactPromiseTimerTimeoutException
.
Этот помощник может быть полезен, когда вам нужно синхронно получить значение от выполненного обещания:
$value = $this->waitForPromise($cache->get('key'));