phpunit Guzzle 异步请求

Posted

技术标签:

【中文标题】phpunit Guzzle 异步请求【英文标题】:phpunit Guzzle Async Requests 【发布时间】:2016-10-06 06:56:57 【问题描述】:

首先让我说我是编写测试的新手,所以我可能会混淆我的工具和/或测试概念。

我已经使用 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();

【问题讨论】:

到目前为止,我已将其隔离到 Guzzle。从他们的示例中复制和粘贴我一直无法复制该功能。 $promise->then() 根本不会触发 【参考方案1】:

检查this issue,这是为了防止递归。您需要在 promise 上调用 wait 并手动勾选 promise 队列

这对我有用(使用 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();
  

【讨论】:

以上是关于phpunit Guzzle 异步请求的主要内容,如果未能解决你的问题,请参考以下文章

Guzzle |异步请求|资源类型错误无效

来自 Guzzle 的 PHPUnit 和模拟请求

利用Guzzle实现另一种PHP异步发送邮件(laravel5.4)

PHP 使用 Guzzle 执行 HTTP 请求

PHP 使用 Guzzle 执行 HTTP 请求

Guzzle同步发送请求