phpunit Guzzle Async Requests

时间:2016-06-06 15:29:43

标签: laravel testing phpunit guzzle

首先我要说的是我刚开始编写测试,所以我可能会混淆我的工具和/或测试概念。

我使用Laravel 5.2构建了一个api。我在./tests中编写了测试,扩展了TestCase,几乎涵盖了api请求和响应的所有元素。

继续使用查询参数进行GET请求所需的api的一些功能。我发现使用Laravel的$ this-> call('GET',$ url)方法并不容易或不可能,所以我添加了Guzzle来实现这一目标。

很棒......当我一次运行一组测试时,一切都有效。

但是,当我运行api的整个测试序列时,我得到了一个TOO MANY CONNECTIONS错误,该错误源于使用Guzzle的测试触发的HTTP请求数。为解决此问题,我尝试使用Guzzle's Async Requests feature

现在的问题是PHPUnit正在完成所有测试,但$ promise() - > then()永远不会执行。

有什么建议吗?

public function testGet()
{

    $promise = $this->client->requestAsync('GET','clients');

    $promise->then(
        function (ResponseInterface $response) {
            $data = json_decode($response->getBody());

            // this never get called
            print_r($data);

        }
    );

    $promise->wait();
}

1 个答案:

答案 0 :(得分:1)

检查this issue,这是为了防止递归。您将需要在promise上调用wait,然后手动在promise队列上打钩

这对我有用(与流明一起使用)

use GuzzleHttp\Promise\FulfilledPromise;

class FulfilledPromiseTest extends TestCase
{
  public function testResolveCallback()
  {
    // Instance objects first
    $console = Mockery::mock('console');
    $promise = new FulfilledPromise('success');

    // Configure expectations
    $console->shouldReceive('log')->once()->with('success');

    // Execute test
    $p = $promise->then(function($response) use($console) {
      $console->log($response);
    });

    //  Tick the promise queue to trigger the callback
    $p->wait();
    \GuzzleHttp\Promise\queue();
  }
}