Как макетировать ответы на конкретные URL с помощью Guzzle?

Документация 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

Решение

Если вы проводите приемочное тестирование с Behat и Mink, лучшим вариантом будет не трогать сам код приложения, а имитировать (заглушки) внешние ресурсы вне приложения. Например, если вы хотите смоделировать Twitter для своего приложения, лучше создать отдельное веб-приложение (с макетами (заглушками) внутри) и передать его URL в ваше приложение (SUT).

Посмотрите на HTTP Mock для PHPUnit: он делает именно это, но в данный момент работает только с PHPUnit. API очень похож на AngularJS:

$this->http->mock
->when()
->methodIs('GET')
->pathIs('/foo')
->then()
->body('mocked body')
->end();
$this->http->setUp();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]