Uma biblioteca que fornece um conjunto de asserções convenientes para testar promessas do ReactPHP. Nos bastidores, usa pista/php-block-react para bloquear promessas.
Ao testar código assíncrono e promessas, as coisas podem ser um pouco complicadas. Esta biblioteca fornece um conjunto de asserções convenientes para testar as promessas do ReactPHP.
Índice
Instalação
Início rápido
Asserções
assertPromiseFulfills()
assertPromiseFulfillsWith()
assertPromiseFulfillsWithInstanceOf()
assertPromiseRejects()
assertPromiseRejectsWith()
assertTrueAboutPromise()
assertFalseAboutPromise()
Ajudantes
waitForPromiseToFulfill()
espereForPromise()
A biblioteca requer PHP 8.0 ou superior.
A forma recomendada de instalar esta biblioteca é via Composer. Novo no Compositor?
Consulte também o CHANGELOG para obter detalhes sobre atualizações de versão.
composer require seregazhuk/react-promise-testing --dev
Use a característica seregazhukReactPromiseTestingAssertsPromise
ou estenda suas classes de teste da classe seregazhukReactPromiseTestingTestCase
, que por sua vez estende PHPUnit TestCase
.
classe final MyTest estende TestCase {/** @test */função pública promessa_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface: :aula); } }
Usando a característica:
usar PHPUnitFrameworkTestCase; usar seregazhukReactPromiseTestingAssertsPromise; classe final MyTest estende TestCase {use AssertsPromise;/** @test */função pública promessa_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface: :aula); } }
O teste acima verifica se uma promessa especificada é cumprida com uma instância de ResponseInterface
.
Para fazer afirmações promissoras, precisamos executar o loop. Antes de cada teste uma nova instância do loop de eventos está sendo criada (dentro do método setUp()
). Se você precisar do loop para construir suas dependências, você deve usar o método eventLoop()
para recuperá-lo.
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
O teste falhará se $promise
for rejeitado.
Você pode especificar $timeout
em segundos para aguardar a resolução da promessa. Se a promessa não for cumprida no tempo limite especificado, o teste falhará. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final PromiseFulfillsTest estende TestCase {/** @test */função pública promessa_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 189 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills Falha ao afirmar que a promessa se cumpre. A promessa foi rejeitada.
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
O teste falhará se $promise
não cumprir um $value
especificado.
Você pode especificar $timeout
em segundos para aguardar o cumprimento da promessa. Se a promessa não for cumprida no tempo limite especificado, o teste falhará. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final PromiseFulfillsWithTest estende TestCase {/** @test */função pública promessa_fulfills_with_a_specified_value(): void{$deferred = new Deferred();$deferred->resolve(1234);$this->assertPromiseFulfillsWith($deferred->promise(), 1); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 180 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value Falha ao afirmar que a promessa cumpre um valor especificado. Falha ao afirmar que 1.234 correspondências eram esperadas 1.
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
O teste falhará se $promise
não for cumprida com uma instância de $class
especificada.
Você pode especificar $timeout
em segundos para aguardar o cumprimento da promessa. Se a promessa não for cumprida no tempo limite especificado, o teste falhará. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final PromiseFulfillsWithInstanceOfTest estende TestCase {/** @test */função pública promessa_fulfills_with_an_instance_of_class(): void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass: :aula); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 180 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class Falha ao afirmar que a promessa cumpre com um valor da classe MyClass.
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
O teste falhará se a $promise
for cumprida.
Você pode especificar $timeout
em segundos para aguardar a resolução da promessa. Se a promessa não foi cumprida no tempo limite especificado, ela será rejeitada com ReactPromiseTimerTimeoutException
. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final PromiseRejectsTest estende TestCase {/** @test */função pública promessa_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 175 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest::promise_rejects Falha ao afirmar que a promessa é rejeitada. A promessa foi cumprida.
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
O teste falhará se $promise
não rejeitar com uma classe de exceção especificada.
Você pode especificar $timeout
em segundos para aguardar a resolução da promessa. Se a promessa não foi cumprida no tempo limite especificado, ela será rejeitada com ReactPromiseTimerTimeoutException
. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final PromiseRejectsWithTest estende TestCase {/** @test */função pública promessa_rejects_with_a_specified_reason(): void{$deferred = new Deferred();$deferred->reject(new LogicException());$this->assertPromiseRejectsWith($deferred->promise(), InvalidArgumentException::class); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 136 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsPromiseRejectsWithTest::promise_rejects_with_a_specified_reason Falha ao afirmar que a promessa foi rejeitada por um motivo especificado. Falha ao afirmar que o objeto LogicException (...) é uma instância da classe "InvalidArgumentException".
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
O teste falhará se o valor encapsulado na promessa não estiver em conformidade com um predicado arbitrário.
Você pode especificar $timeout
em segundos para aguardar a resolução da promessa. Se a promessa não foi cumprida no tempo limite especificado, ela será rejeitada com ReactPromiseTimerTimeoutException
. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final AssertTrueAboutPromiseTest estende TestCase {/** @test */função pública promessa_encapsulas_integer(): void{$deferido = novo Deferido();$deferido->resolver(23);$this->assertTrueAboutPromise($deferido->promise(), função ($ val) {return is_object($val); }); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 136 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsAssertTrueAboutPromiseTest::promise_encapsulates_integer Falha ao afirmar que falso é verdadeiro.
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
O teste falhará se o valor encapsulado na Promessa estiver em conformidade com um predicado arbitrário.
Você pode especificar $timeout
em segundos para aguardar a resolução da promessa. Se a promessa não foi cumprida no tempo limite especificado, ela será rejeitada com ReactPromiseTimerTimeoutException
. Quando não especificado, o tempo limite é definido como 2 segundos.
classe final AssertFalseAboutPromiseTest estende TestCase {/** @test */função pública promessa_encapsulas_object(): void{$deferido = novo Deferido();$deferido->resolver(23);$this->assertFalseAboutPromise($deferido->promise(), função ($ val) {return is_int($val); }); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 136 ms, Memória: 4,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsAssertFalseAboutPromiseTest::promise_encapsulates_object Falha ao afirmar que verdadeiro é falso.
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
.
Este auxiliar pode ser usado quando você deseja resolver uma promessa e obter o valor da resolução.
Tenta resolver uma $promise
em um $timeout
segundos especificado e retorna o valor resolvido. Se $timeout
não estiver definido, usa 2 segundos por padrão. O teste falhará se a $promise
não for cumprida.
classe final WaitForPromiseToFulfillTest estende TestCase {/** @test */função pública promessa_fulfills(): void{$deferred = new Deferred();$deferred->reject(new Exception());$value = $this->waitForPromiseToFulfill($deferred->promise ()); } }
PHPUnit 8.5.2 por Sebastian Bergmann e colaboradores. F 1/1 (100%) Tempo: 223 ms, Memória: 6,00 MB Houve 1 falha: 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills Não cumpriu uma promessa. Foi rejeitado com exceção.
function waitForPromise(PromiseInterface $promise, int $timeout = null)
.
Tenta resolver uma $promise
especificada em um $timeout
segundos especificado. Se $timeout
não estiver definido, usa 2 segundos por padrão. Se a promessa for cumprida, retorna um valor de resolução, caso contrário, lança uma exceção. Se a promessa for rejeitada, lançará o motivo da rejeição, se a promessa não for cumprida em um $timeout
especificado, lançará ReactPromiseTimerTimeoutException
.
Este auxiliar pode ser útil quando você precisa obter o valor da promessa cumprida de forma síncrona:
$valor = $this->waitForPromise($cache->get('chave'));