Eine Bibliothek, die eine Reihe praktischer Behauptungen zum Testen von ReactPHP-Versprechen bereitstellt. Unter der Haube werden Clue/php-block-react verwendet, um Versprechen zu blockieren.
Beim Testen von asynchronem Code und Versprechen kann es etwas knifflig sein. Diese Bibliothek bietet eine Reihe praktischer Behauptungen zum Testen von ReactPHP-Versprechen.
Inhaltsverzeichnis
Installation
Schnellstart
Behauptungen
behauptenPromiseFulfills()
behauptenPromiseFulfillsWith()
behauptenPromiseFulfillsWithInstanceOf()
behauptenPromiseRejects()
behauptenPromiseRejectsWith()
behauptenTrueAboutPromise()
behauptenFalseAboutPromise()
Helfer
waitForPromiseToFulfill()
waitForPromise()
Die Bibliothek erfordert PHP 8.0 oder höher.
Die empfohlene Methode zur Installation dieser Bibliothek ist die Verwendung von Composer. Neu bei Composer?
Einzelheiten zu Versionsaktualisierungen finden Sie auch im CHANGELOG.
composer require seregazhuk/react-promise-testing --dev
Verwenden Sie das Merkmal seregazhukReactPromiseTestingAssertsPromise
oder erweitern Sie Ihre Testklassen aus der Klasse seregazhukReactPromiseTestingTestCase
, die ihrerseits PHPUnit TestCase
erweitert.
Die letzte Klasse MyTest erweitert 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: :Klasse); } }
Verwendung des Merkmals:
verwenden Sie PHPUnitFrameworkTestCase; verwenden Sie seregazhukReactPromiseTestingAssertsPromise; die letzte Klasse MyTest erweitert 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: :Klasse); } }
Der obige Test überprüft, ob ein angegebenes Versprechen mit einer Instanz von ResponseInterface
erfüllt wird.
Um Versprechensaussagen zu treffen, müssen wir die Schleife ausführen. Vor jedem Test wird eine neue Instanz der Ereignisschleife erstellt (innerhalb setUp()
-Methode). Wenn Sie die Schleife zum Erstellen Ihrer Abhängigkeiten benötigen, sollten Sie sie mit der Methode eventLoop()
abrufen.
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
Der Test schlägt fehl, wenn das $promise
ablehnt.
Sie können $timeout
in Sekunden angeben, um auf die Lösung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb der angegebenen Zeitspanne erfüllt wurde, schlägt der Test fehl. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse PromiseFulfillsTest erweitert TestCase {/** @test */public function Promise_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
PHPUnit 8.5.2 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 189 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills Die Behauptung, dass das Versprechen erfüllt wird, ist fehlgeschlagen. Versprechen wurde abgelehnt.
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
Der Test schlägt fehl, wenn das $promise
einen angegebenen $value
nicht erfüllt.
Sie können $timeout
in Sekunden angeben, um auf die Erfüllung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb der angegebenen Zeitspanne erfüllt wurde, schlägt der Test fehl. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse PromiseFulfillsWithTest erweitert 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 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 180 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value Es konnte nicht bestätigt werden, dass das Versprechen mit einem angegebenen Wert erfüllt wird. Fehler bei der Behauptung, dass 1234 Übereinstimmungen erwartet werden: 1.
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
Der Test schlägt fehl, wenn das $promise
mit einer Instanz der angegebenen $class
nicht erfüllt wird.
Sie können $timeout
in Sekunden angeben, um auf die Erfüllung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb der angegebenen Zeitspanne erfüllt wurde, schlägt der Test fehl. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse PromiseFulfillsWithInstanceOfTest erweitert TestCase {/** @test */public function Promise_fulfills_with_an_instance_of_class(): void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass: :Klasse); } }
PHPUnit 8.5.2 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 180 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithWithInstanceOfTest::promise_fulfills_with_an_instance_of_class Es konnte nicht bestätigt werden, dass das Versprechen mit einem Wert der Klasse „MyClass“ erfüllt wird.
assertPromiseRejects(PromiseInterface $promise, int $timeout = null): void
Der Test schlägt fehl, wenn das $promise
erfüllt wird.
Sie können $timeout
in Sekunden angeben, um auf die Lösung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb des angegebenen Timeouts erfüllt wurde, wird es mit ReactPromiseTimerTimeoutException
abgelehnt. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse PromiseRejectsTest erweitert TestCase {/** @test */public function Promise_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
PHPUnit 8.5.2 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 175 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest::promise_rejects Die Geltendmachung dieses Versprechens ist fehlgeschlagen. Versprechen wurde erfüllt.
assertPromiseRejectsWith(PromiseInterface $promise, string $reasonExceptionClass, int $timeout = null): void
Der Test schlägt fehl, wenn das $promise
nicht mit einer angegebenen Ausnahmeklasse ablehnt.
Sie können $timeout
in Sekunden angeben, um auf die Lösung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb des angegebenen Timeouts erfüllt wurde, wird es mit ReactPromiseTimerTimeoutException
abgelehnt. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse PromiseRejectsWithTest erweitert 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 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 136 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsPromiseRejectsWithTest::promise_rejects_with_a_specified_reason Die Geltendmachung, dass das Versprechen aus einem bestimmten Grund abgelehnt wird, ist fehlgeschlagen. Fehler beim Bestätigen, dass das LogicException-Objekt (...) eine Instanz der Klasse „InvalidArgumentException“ ist.
assertTrueAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Der Test schlägt fehl, wenn der im Versprechen gekapselte Wert nicht einem willkürlichen Prädikat entspricht.
Sie können $timeout
in Sekunden angeben, um auf die Lösung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb des angegebenen Timeouts erfüllt wurde, wird es mit ReactPromiseTimerTimeoutException
abgelehnt. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse AssertTrueAboutPromiseTest erweitert 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 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 136 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsAssertTrueAboutPromiseTest::promise_encapsulates_integer Die Behauptung, dass „falsch“ wahr ist, ist fehlgeschlagen.
assertFalseAboutPromise(PromiseInterface $promise, callable $predicate, int $timeout = null): void
Der Test schlägt fehl, wenn der im Versprechen gekapselte Wert einem willkürlichen Prädikat entspricht.
Sie können $timeout
in Sekunden angeben, um auf die Lösung des Versprechens zu warten. Wenn das Versprechen nicht innerhalb des angegebenen Timeouts erfüllt wurde, wird es mit ReactPromiseTimerTimeoutException
abgelehnt. Wenn nichts angegeben wird, wird das Timeout auf 2 Sekunden eingestellt.
Die letzte Klasse AssertFalseAboutPromiseTest erweitert 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 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 136 ms, Speicher: 4,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsAssertFalseAboutPromiseTest::promise_encapsulates_object Die Behauptung, dass „wahr“ falsch ist, ist fehlgeschlagen.
function waitForPromiseToFulfill(PromiseInterface $promise, int $timeout = null)
.
Dieser Helfer kann verwendet werden, wenn Sie ein Versprechen auflösen und den Auflösungswert erhalten möchten.
Versucht, ein $promise
in einem angegebenen $timeout
Sekunden aufzulösen und gibt den aufgelösten Wert zurück. Wenn $timeout
nicht festgelegt ist, werden standardmäßig 2 Sekunden verwendet. Der Test schlägt fehl, wenn das $promise
nicht erfüllt wird.
Die letzte Klasse WaitForPromiseToFulfillTest erweitert TestCase {/** @test */public function Promise_fulfills(): void{$deferred = new Deferred();$deferred->reject(new Exception());$value = $this->waitForPromiseToFulfill($deferred->promise ()); } }
PHPUnit 8.5.2 von Sebastian Bergmann und Mitwirkenden. F 1 / 1 (100 %) Zeit: 223 ms, Speicher: 6,00 MB Es gab 1 Fehler: 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills Ein Versprechen konnte nicht eingehalten werden. Es wurde mit Ausnahme abgelehnt.
function waitForPromise(PromiseInterface $promise, int $timeout = null)
.
Versucht, ein angegebenes $promise
in einem angegebenen $timeout
Sekunden aufzulösen. Wenn $timeout
nicht festgelegt ist, werden standardmäßig 2 Sekunden verwendet. Wenn das Versprechen erfüllt wird, wird ein Auflösungswert zurückgegeben, andernfalls wird eine Ausnahme ausgelöst. Wenn das Versprechen ablehnt, wird der Ablehnungsgrund ausgelöst. Wenn das Versprechen nicht in einem angegebenen $timeout
erfüllt wird, wird ReactPromiseTimerTimeoutException
ausgelöst.
Dieser Helfer kann nützlich sein, wenn Sie den Wert des erfüllten Versprechens auf synchrone Weise abrufen müssen:
$value = $this->waitForPromise($cache->get('key'));