ReactPHP Promise 테스트를 위한 편리한 어설션 세트를 제공하는 라이브러리입니다. 내부적으로는 promise/php-block-react를 사용하여 약속을 차단합니다.
비동기 코드와 Promise를 테스트할 때는 약간 까다로울 수 있습니다. 이 라이브러리는 ReactPHP Promise를 테스트하기 위한 편리한 어설션 세트를 제공합니다.
목차
설치
빠른 시작
주장
주장PromiseFulfills()
주장PromiseFulfillsWith()
주장PromiseFulfillsWithInstanceOf()
주장PromiseRejects()
주장PromiseRejectsWith()
주장TrueAboutPromise()
주장FalseAboutPromise()
도우미
waitForPromiseToFulfill()
약속을 기다려()
라이브러리에는 PHP 8.0 이상이 필요합니다.
이 라이브러리를 설치하는 권장 방법은 Composer를 이용하는 것입니다. Composer를 처음 사용하시나요?
버전 업그레이드에 대한 자세한 내용은 CHANGELOG를 참조하세요.
composer require seregazhuk/react-promise-testing --dev
seregazhukReactPromiseTestingAssertsPromise
특성을 사용하거나 자체적으로 PHPUnit TestCase
확장하는 seregazhukReactPromiseTestingTestCase
클래스에서 테스트 클래스를 확장하세요.
최종 클래스 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 사용;최종 클래스 MyTest는 TestCase를 확장합니다. {AssertsPromise 사용;/** @test */공용 함수 promise_fulfills_with_a_response_object() {$browser = new ClueReactBuzzBrowser($this->eventLoop());$promise = $browser->get('http://www.google.com/');$this->assertPromiseFulfillsWithInstanceOf($promise, ResponseInterface: :수업); } }
위의 테스트는 지정된 Promise가 ResponseInterface
인스턴스로 이행되는지 확인합니다.
약속을 주장하려면 루프를 실행해야 합니다. 각 테스트 전에 이벤트 루프의 새 인스턴스가 생성됩니다( setUp()
메서드 내에서). 종속성을 구축하기 위해 루프가 필요한 경우 eventLoop()
메서드를 사용하여 이를 검색 해야 합니다 .
public function assertPromiseFulfills(PromiseInterface $promise, int $timeout = null): void
$promise
거부되면 테스트가 실패합니다.
$timeout
초 단위로 지정하여 Promise가 해결될 때까지 기다릴 수 있습니다. 약속이 지정된 시간 초과 내에 이행되지 않으면 테스트가 실패합니다. 지정하지 않으면 시간 초과가 2초로 설정됩니다.
최종 클래스 PromiseFulfillsTest는 TestCase를 확장합니다. {/** @test */public 함수 promise_fulfills(): void{$deferred = new Deferred();$deferred->reject();$this->assertPromiseFulfills($deferred->promise(), 1); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 189ms, 메모리: 4.00MB 1개의 실패가 있었습니다: 1) seregazhukReactPromiseTestingtestsPromiseFulfillTest::promise_fulfills 약속이 이행되었다고 주장하지 못했습니다. 약속이 거부되었습니다.
assertPromiseFulfillsWith(PromiseInterface $promise, $value, int $timeout = null): void
$promise
지정된 $value
를 충족하지 않으면 테스트가 실패합니다.
$timeout
초 단위로 지정하여 약속이 이행될 때까지 기다릴 수 있습니다. 약속이 지정된 시간 초과 내에 이행되지 않으면 테스트가 실패합니다. 지정하지 않으면 시간 초과가 2초로 설정됩니다.
최종 클래스 PromiseFulfillsWithTest는 TestCase를 확장합니다. {/** @test */public 함수 promise_fulfills_with_a_specified_value(): void{$deferred = new Deferred();$deferred->resolve(1234);$this->assertPromiseFulfillsWith($deferred->promise(), 1); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 180ms, 메모리: 4.00MB 1개의 실패가 있었습니다: 1) seregazhukReactPromiseTestingtestsPromiseFulfillsWithTest::promise_fulfills_with_a_specified_value 약속이 지정된 값으로 이행된다고 주장하는 데 실패했습니다. 1234개의 일치 항목이 예상되는 1이라고 어설션하는 데 실패했습니다.
assertPromiseFulfillsWithInstanceOf(PromiseInterface $promise, string $class, int $timeout = null): void
$promise
지정된 $class
인스턴스로 충족되지 않으면 테스트가 실패합니다.
$timeout
초 단위로 지정하여 약속이 이행될 때까지 기다릴 수 있습니다. 약속이 지정된 시간 초과 내에 이행되지 않으면 테스트가 실패합니다. 지정하지 않으면 시간 초과가 2초로 설정됩니다.
최종 클래스 PromiseFulfillsWithInstanceOfTest는 TestCase를 확장합니다. {/** @test */공용 함수 promise_fulfills_with_an_instance_of_class(): void{$deferred = new Deferred();$deferred->resolve(new MyClass);$this->assertPromiseFulfillsWithInstanceOf($deferred->promise(), MyClass: :수업); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 180ms, 메모리: 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 함수 promise_rejects(): void{$deferred = new Deferred();$deferred->resolve();$this->assertPromiseRejects($deferred->promise()); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 175ms, 메모리: 4.00MB 1개의 실패가 있었습니다: 1) seregazhukReactPromiseTestingtestsPromiseRejectsTest::promise_rejects Promise가 거부되었음을 주장하는 데 실패했습니다. 약속이 이루어졌습니다.
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); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 136ms, 메모리: 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 함수 promise_encapsulates_integer(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertTrueAboutPromise($deferred->promise(), 함수($ val) {return is_object($val); }); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 136ms, 메모리: 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 함수 promise_encapsulates_object(): void{$deferred = new Deferred();$deferred->resolve(23);$this->assertFalseAboutPromise($deferred->promise(), 함수($ val) {return is_int($val); }); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 136ms, 메모리: 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 */공용 함수 promise_fulfills(): void{$deferred = new Deferred();$deferred->reject(new Exception());$value = $this->waitForPromiseToFulfill($deferred->promise ()); } }
Sebastian Bergmann 및 기여자가 만든 PHPUnit 8.5.2. 에프 1/1 (100%) 시간: 223ms, 메모리: 6.00MB 1개의 실패가 있었습니다: 1) seregazhukReactPromiseTestingtestsWaitForPromiseToFulfillTest::promise_fulfills 약속을 이행하지 못했습니다. 예외로 인해 거부되었습니다.
function waitForPromise(PromiseInterface $promise, int $timeout = null)
.
지정된 $timeout
초 내에 지정된 $promise
해결하려고 시도합니다. $timeout
설정되지 않은 경우 기본적으로 2초를 사용합니다. 약속이 이행되면 해결 값이 반환되고, 그렇지 않으면 예외가 발생합니다. 약속이 거부되면 거부 이유가 발생하고, 약속이 지정된 $timeout
내에 이행되지 않으면 ReactPromiseTimerTimeoutException
발생합니다.
이 도우미는 동기식으로 이행된 Promise에서 값을 가져와야 할 때 유용할 수 있습니다.
$value = $this->waitForPromise($cache->get('key'));