如何使用Guzzle模拟特定URL的响应?

Mic*_*rin 5 php unit-testing mocking guzzle guzzle6

Guzzle 6文档提供了一种模拟HTTP调用的简便方法,以便每个请求都返回特定的响应:http : //docs.guzzlephp.org/en/latest/testing.html#mock-handler

但是,正如文档中所述,MockHandler定义了将按相同顺序针对每个请求(无论URL)发送的响应队列。

如何让Guzzle在每次调用时都针对给定的URL发送特定的响应?

例如,我要这个电话:

$client->request('GET', '/products')->getBody();
Run Code Online (Sandbox Code Playgroud)

不提出实际要求,而是始终返回:

{'products' => [{id: 1, name: 'Product 1'}, {id: 2, name: 'Product 2'}]
Run Code Online (Sandbox Code Playgroud)

使用AngularJS $httpBackend服务很容易:

$httpBackend
    .when('GET', '/products')
    .respond("{id: 1, name: 'Product 1'}, {id: 2, name: 'Product 2'}")
Run Code Online (Sandbox Code Playgroud)

关于如何使用Guzzle 6做到这一点的任何想法?

Ale*_*kov 0

如果您使用 Behat 和 Mink 进行验收测试,最好的选择是不要接触应用程序代码本身,而是模拟(存根)应用程序外部的外部资源。例如,如果您想为您的应用程序模拟 Twitter,最好创建一个单独的 Web 应用程序(内部带有模拟(存根))并将其 URL 传递给您的应用程序 ( SUT )。

看一下PHPUnit 的 HTTP Mock:它正是这样做的,但目前仅适用于 PHPUnit。API 与 AngularJS 非常相似:

$this->http->mock
    ->when()
        ->methodIs('GET')
        ->pathIs('/foo')
    ->then()
        ->body('mocked body')
    ->end();
$this->http->setUp();
Run Code Online (Sandbox Code Playgroud)