【发布时间】:2016-01-07 00:47:59
【问题描述】:
Guzzle 6 文档提供了一种模拟 HTTP 调用的简单方法,以便每个请求都返回一个特定的响应:http://docs.guzzlephp.org/en/latest/testing.html#mock-handler
但是,正如文档中所述,MockHandler 定义了一个响应队列,无论 URL 是什么,都将以相同的顺序为每个请求发送响应队列。
如何告诉 Guzzle 在每次调用给定 URL 时发送特定响应?
例如,我想要这个电话:
$client->request('GET', '/products')->getBody();
不提出实际请求,但总是返回:
{'products' => [{id: 1, name: 'Product 1'}, {id: 2, name: 'Product 2'}]
使用 AngularJS $httpBackend 服务很容易:
$httpBackend
.when('GET', '/products')
.respond("{id: 1, name: 'Product 1'}, {id: 2, name: 'Product 2'}")
知道如何使用 Guzzle 6 实现这一目标吗?
【问题讨论】:
-
您能否提供一些有关测试设置或一般应用程序的上下文?我试图理解为什么您需要多次调用任何特定的 url,特别是如果您只是想返回相同的响应。
-
@ShaunBramley 我正在使用 Behat 和 Mink 进行功能测试。所以我在测试中加载了我网站的一个页面(例如
Given I am on /catalog),这是一个使用 Guzzle 对外部 API 进行多次调用(例如获取产品的调用和获取最新消息的调用)的页面,我不这样做不必知道调用的顺序。而且我不希望我的测试在我的测试过程中依赖于外部 API(可能会出现故障、缓慢或其他什么),因为这是我要测试的页面(它应该显示来自 API 的产品/新闻),不是 API 本身。这是上下文! -
我正在寻找相同的解决方案。我找到了这个库:github.com/eschwartz/GuzzleHttpMock(目前支持guzzle 5,不知道是否支持6个分支)
-
Guzzle 6 的 URL(固定和基于正则表达式)模拟处理程序 - tarampampam/guzzle-url-mock
标签: php unit-testing mocking guzzle guzzle6