Une bibliothèque qui fournit un ensemble d'assertions pratiques pour tester les promesses de ReactPHP. Sous le capot, utilise Clue/php-block-react pour bloquer les promesses.
Lors du test du code asynchrone et des promesses, les choses peuvent être un peu délicates. Cette bibliothèque fournit un ensemble d'assertions pratiques pour tester les promesses de ReactPHP.
Table des matières
Installation
Démarrage rapide
Affirmations
assertPromiseFulfills()
assertPromiseFulfillsWith()
assertPromiseFulfillsWithInstanceOf()
assertPromiseRejects()
assertPromiseRejectsWith()
assertTrueAboutPromise()
assertFalseAboutPromise()
Aides
waitForPromiseToFulfill()
attendre la promesse()
La bibliothèque nécessite PHP 8.0 ou supérieur.
La méthode recommandée pour installer cette bibliothèque est via Composer. Nouveau sur Composer ?
Voir également le CHANGELOG pour plus de détails sur les mises à niveau de version.
composer require seregazhuk/react-promise-testing --dev
Utilisez le trait seregazhukReactPromiseTestingAssertsPromise
ou étendez vos classes de test à partir de la classe seregazhukReactPromiseTestingTestCase
, qui étend elle-même PHPUnit TestCase
.
la classe finale MyTest étend 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 : :classe); } }
Utilisation du trait :
utiliser PHPUnitFrameworkTestCase ; utiliser seregazhukReactPromiseTestingAssertsPromise ; la classe finale MyTest étend TestCase {utilisez 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 : :classe); } }
Le test ci-dessus vérifie qu'une promesse spécifiée se réalise avec une instance de ResponseInterface
.
Pour faire des assertions de promesse, nous devons exécuter la boucle. Avant chaque test, une nouvelle instance de la boucle d'événements est créée (dans la méthode setUp()
). Si vous avez besoin de la boucle pour créer vos dépendances, vous devez utiliser la méthode eventLoop()
pour la récupérer.
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
Le test échoue si la $promise
est rejetée.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit résolue. Si la promesse n'a pas été remplie dans le délai spécifié, le test échoue. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale PromiseFulfillsTest étend TestCase {/** @test */public function promise_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 189 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest ::promise_fulfills Échec de l’affirmation que cette promesse se réalise. La promesse a été rejetée.
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
Le test échoue si la $promise
ne correspond pas à une $value
spécifiée.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit tenue. Si la promesse n'a pas été remplie dans le délai spécifié, le test échoue. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale PromiseFulfillsWithTest étend 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 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 180 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest ::promise_fulfills_with_a_specified_value Échec de l'affirmation que la promesse se réalise avec une valeur spécifiée. Échec de l'affirmation selon laquelle 1 234 matchs étaient attendus 1.
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
Le test échoue si la $promise
ne se réalise pas avec une instance de $class
spécifiée.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit tenue. Si la promesse n'a pas été remplie dans le délai spécifié, le test échoue. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale PromiseFulfillsWithInstanceOfTest étend TestCase {/** @test */public function promise_fulfills_with_an_instance_of_class() : void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass : :classe); } }
PHPUnit 8.5.2 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 180 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest ::promise_fulfills_with_an_instance_of_class Échec de l'affirmation de cette promesse avec une valeur de classe MyClass.
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
Le test échoue si la $promise
est remplie.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit résolue. Si la promesse n'a pas été tenue dans le délai spécifié, elle est rejetée avec ReactPromiseTimerTimeoutException
. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale PromiseRejectsTest étend TestCase {/** @test */public function promise_rejects() : void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 175 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest ::promise_rejects Échec de l'affirmation de cette promesse rejetée. La promesse a été tenue.
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
Le test échoue si $promise
n'est pas rejeté avec une classe d'exception spécifiée.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit résolue. Si la promesse n'a pas été tenue dans le délai spécifié, elle est rejetée avec ReactPromiseTimerTimeoutException
. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale PromiseRejectsWithTest étend 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 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 136 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsPromiseRejectsWithTest ::promise_rejects_with_a_specified_reason Échec de l'affirmation de cette promesse rejetée pour une raison spécifiée. Échec de l'affirmation selon laquelle LogicException Object (...) est une instance de la classe "InvalidArgumentException".
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Le test échoue si la valeur encapsulée dans la promesse n'est pas conforme à un prédicat arbitraire.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit résolue. Si la promesse n'a pas été tenue dans le délai spécifié, elle est rejetée avec ReactPromiseTimerTimeoutException
. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale AssertTrueAboutPromiseTest étend TestCase {/** @test */public function promise_encapsulates_integer() : void{$deferred = new Deferred();$deferred->resolve(23);$this->assertTrueAboutPromise($deferred->promise()), fonction ($ val) {return is_object($val); }); } }
PHPUnit 8.5.2 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 136 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsAssertTrueAboutPromiseTest ::promise_encapsulates_integer Échec de l'affirmation que faux est vrai.
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Le test échoue si la valeur encapsulée dans la promesse est conforme à un prédicat arbitraire.
Vous pouvez spécifier $timeout
en secondes pour attendre que la promesse soit résolue. Si la promesse n'a pas été tenue dans le délai spécifié, elle est rejetée avec ReactPromiseTimerTimeoutException
. Lorsqu'il n'est pas spécifié, le délai d'attente est défini sur 2 secondes.
la classe finale AssertFalseAboutPromiseTest étend TestCase {/** @test */public function promise_encapsulates_object() : void{$deferred = new Deferred();$deferred->resolve(23);$this->assertFalseAboutPromise($deferred->promise()), fonction ($ val) {return is_int($val); }); } }
PHPUnit 8.5.2 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 136 ms, Mémoire : 4,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsAssertFalseAboutPromiseTest ::promise_encapsulates_object Échec de l'affirmation que vrai est faux.
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
.
Cette assistante peut être utilisée lorsque vous souhaitez résoudre une promesse et obtenir la valeur de résolution.
Essaie de résoudre une $promise
dans un délai $timeout
spécifié et renvoie la valeur résolue. Si $timeout
n'est pas défini, utilise 2 secondes par défaut. Le test échoue si la $promise
ne se réalise pas.
la classe finale WaitForPromiseToFulfillTest étend TestCase {/** @test */public function promise_fulfills() : void{$deferred = new Deferred();$deferred->reject(new Exception());$value = $this->waitForPromiseToFulfill($deferred->promise ()); } }
PHPUnit 8.5.2 par Sebastian Bergmann et contributeurs. F 1 / 1 (100%) Temps : 223 ms, Mémoire : 6,00 Mo Il y a eu 1 échec : 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest ::promise_fulfills N'a pas tenu une promesse. Il a été rejeté avec exception.
function waitForPromise(PromiseInterface $promise, int $timeout = null)
.
Essaie de résoudre une $promise
spécifiée dans un $timeout
secondes spécifié. Si $timeout
n'est pas défini, utilise 2 secondes par défaut. Si la promesse se réalise, renvoie une valeur de résolution, sinon lève une exception. Si la promesse est rejetée, la raison du rejet est levée, si la promesse ne se réalise pas dans un $timeout
spécifié, ReactPromiseTimerTimeoutException
.
Cette aide peut être utile lorsque vous avez besoin d'obtenir la valeur de la promesse remplie de manière synchrone :
$value = $this->waitForPromise($cache->get('key'));