PHPUnit Guzzle异步请求

3
让我先说一下,我是新手写测试,所以我的工具和/或测试概念可能会混淆。
我使用 Laravel 5.2 构建了一个 API。我编写了测试,在 ./tests 中扩展 TestCase 来覆盖几乎所有的 API 请求和响应元素。
接下来,我需要使用查询参数进行 GET 请求来完成 API 的一些功能。我发现使用 Laravel 的 $this->call('GET', $url) 方法很难或不可能实现,所以我添加了 Guzzle 来完成这个任务。
太好了...当我一次运行一组测试时,一切都正常。
但是,当我运行整个 API 测试序列时,由于使用 Guzzle 触发的 HTTP 请求数量过多,我会得到一个 TOO MANY CONNECTIONS 错误。为了解决这个问题,我尝试使用 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();
}

到目前为止,我已经将问题隔离到了 Guzzle。从他们的示例中直接复制和粘贴,我无法复制功能。$promise->then() 根本没有触发。 - Bradley
1个回答

1

请检查此问题,这是有意为之的,以防止递归。您需要在承诺上调用等待并手动挂起承诺队列。

对我来说这很有效(使用Lumen)

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();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接