2017-02-09 27 views
2

Есть ли способ издеваться над ответом и запросом в Guzzle?Макет ответа и использование истории промежуточного программного обеспечения в то же время в Guzzle

У меня есть класс, который отправляет некоторый запрос, и я хочу протестировать.

В Guzzle doc Я нашел способ, как я могу макет ответа и запроса отдельно. Но как я могу их объединить?

Потому что, если стек истории использования используется, жмет попытку отправить реальный запрос. И визовый стих, когда я издеваюсь над обработчиком ответа, не может проверить запрос.

class MyClass { 

    public function __construct($guzzleClient) { 

     $this->client = $guzzleClient; 

    } 

    public function registerUser($name, $lang) 
    { 

      $body = ['name' => $name, 'lang' = $lang, 'state' => 'online']; 

      $response = $this->sendRequest('PUT', '/users', ['body' => $body]; 

      return $response->getStatusCode() == 201;   
    } 

    protected function sendRequest($method, $resource, array $options = []) 
    { 

     try { 
      $response = $this->client->request($method, $resource, $options); 
     } catch (BadResponseException $e) { 
      $response = $e->getResponse(); 
     } 

     $this->response = $response; 

     return $response; 
    } 

} 

Тест:

class MyClassTest { 

    //.... 
public function testRegisterUser() 

{ 

    $guzzleMock = new \GuzzleHttp\Handler\MockHandler([ 
     new \GuzzleHttp\Psr7\Response(201, [], 'user created response'), 
    ]); 

    $guzzleClient = new \GuzzleHttp\Client(['handler' => $guzzleMock]); 

    $myClass = new MyClass($guzzleClient); 
    /** 
    * But how can I check that request contains all fields that I put in the body? Or if I add some extra header? 
    */ 
    $this->assertTrue($myClass->registerUser('John Doe', 'en')); 


} 
//... 

} 
+0

сообщение какой-то код. Описание довольно запутанное. В чем смысл насмешливых запросов? Вы проверяете пользовательские обработчики? –

+0

Я обновил код @AlexBlex. С примером макетного ответа и в документе мы можем проверить запрос. Вопрос: как я могу смешать этот http://docs.guzzlephp.org/en/latest/testing.html#mock-handler и этот http://docs.guzzlephp.org/en/latest/testing.html#history- middleware – xAoc

ответ

2

@Alex Blex был очень близок.

Решение:

$container = []; 
$history = \GuzzleHttp\Middleware::history($container); 

$guzzleMock = new \GuzzleHttp\Handler\MockHandler([ 
    new \GuzzleHttp\Psr7\Response(201, [], 'user created response'), 
]); 

$stack = \GuzzleHttp\HandlerStack::create(guzzleMock); 

$stack->push($history); 

$guzzleClient = new \GuzzleHttp\Client(['handler' => $stack]); 
1

Прежде всего, вы не имитировали запросы. Запросы - настоящие, которые вы собираетесь использовать в производстве. Фиктивный обработчик на самом деле стек, так что вы можете нажать несколько обработчиков там:

$container = []; 
$history = \GuzzleHttp\Middleware::history($container); 

$stack = \GuzzleHttp\Handler\MockHandler::createWithMiddleware([ 
    new \GuzzleHttp\Psr7\Response(201, [], 'user created response'), 
]); 

$stack->push($history); 

$guzzleClient = new \GuzzleHttp\Client(['handler' => $stack]); 

После запуска тестов, $container будет иметь все сделки для вас утверждать. В вашем конкретном тесте - единственная транзакция. Вас интересует $container[0]['request'], так как $container[0]['response'] будет содержать ваш законченный отклик, так что на самом деле нечего утверждать.

+0

Я получил ошибку [ErrorException] Аргумент 1 передан GuzzleHttp \ Handler \ MockHandler :: __ invoke() должен реализовать интерфейс Psr \ Http \ Message \ RequestInterface, экземпляр Закрытого предложения, вызванный в/vendor/guzzlehttp/guzzle/src/HandlerStack.php в строке 199 и определен – xAoc

+0

А, извините, забыл, что MockHandler должен использовать фабрику для создания стека. Я обновил ответ. –

+1

Только что понял, что вы решили это самостоятельно. Отлично сработано! –