6

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 实现这一目标的任何想法?

4

2 回答 2

1

使用 guzzle 6,您还可以将函数用作处理程序!并且该函数传递 Request 对象,因此您可以检查 URL 并返回正确的响应。

例子:

        $client = new Client([
            'handler' => function (GuzzleHttp\Psr7\Request $request) {
                $path = $request->getUri()->getPath();

                if ($path === '/url1') {
                    return new GuzzleHttp\Psr7\Response(200, [], '{"body": "Url1"}');
                }

                if ($path === '/url2') {
                    return new GuzzleHttp\Psr7\Response(200, [], '{"body": "Url2"}');
                }
            }
        ]);

        $client->get('/url1');

我希望这对某人有所帮助。

于 2021-11-14T15:37:39.530 回答
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();
于 2016-07-22T15:03:24.273 回答