Документация 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?
Если вы проводите приемочное тестирование с 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();
Других решений пока нет …