2015-10-09 1 views
4

документация жрать 6 дает простой способ поиздеваться HTTP называет так, что каждый запрос возвращает конкретный ответ: http://docs.guzzlephp.org/en/latest/testing.html#mock-handlerКак издеваться над определенными URL-адресами с помощью Guzzle?

Однако, как указано в документации, то MockHandler определяет очередность ответов, которые будут отправлены на каждый запрос, независимо от URL-адреса, в том же порядке.

Как сообщить Guzzle отправить конкретный ответ для заданного URL-адреса каждый раз, когда он вызывается?

Например, я хочу этот вызов:

$client->request('GET', '/products')->getBody(); 

не сделать фактический запрос, но всегда возвращаться:

{'products' => [{id: 1, name: 'Product 1'}, {id: 2, name: 'Product 2'}] 

Doing его с AngularJS $httpBackend обслуживание будет легко:

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

Любая идея о том, как достичь этого с помощью Guzzle 6?

+0

Можете ли вы предоставить некоторый контекст, касающийся тестовой установки или приложения в целом? Я пытаюсь понять, почему вам нужно сделать более одного вызова для любого конкретного URL-адреса, особенно если вы просто хотите вернуть идентичные ответы. –

+0

@ShaunBramley Я делаю функциональные тесты с Behat и Mink. Поэтому я загружаю страницу своего сайта в тест (например, «Учитывая, что я нахожусь в каталоге/каталог»), которая представляет собой страницу, которая вызывает несколько вызовов внешнего API (вызов для получения продуктов и вызов для получения последних новостей, например) с Guzzle, и мне не нужно знать порядок звонков. И мне не хотелось бы, чтобы мой тест зависел от внешнего API во время моих тестов (который может быть медленным, медленным или каким-либо другим), поскольку это страница, которую я хочу протестировать (она должна отображать продукты/новости из API), а не сам API. Это контекст! –

+0

Я ищу то же самое решение. Я нашел эту библиотеку: https://github.com/eschwartz/GuzzleHttpMock (он в настоящее время поддерживает wzzle 5, интересно, поддерживает ли он 6 ветвей) –

ответ

0

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

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

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

Это интересно, спасибо! Кажется, я делаю то, что ищу. Я посмотрю на это. –

Смежные вопросы