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 异步请求的主要内容,如果未能解决你的问题,请参考以下文章