Ложный ответ и использование истории промежуточного программного обеспечения одновременно в Guzzle

Есть ли способ высмеять ответ и запрос в Guzzle?

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

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

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

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'));}
//...

}

4

Решение

@ Алекс Блекс был очень близко.

Решение:

$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]);
4

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

Прежде всего, вы не высмеиваете запросы. Запросы являются реальными, которые вы собираетесь использовать в производстве. Обработчик макета на самом деле является стеком, поэтому вы можете поместить туда несколько обработчиков:

$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'] будет содержать ваш законный ответ, так что на самом деле нечего утверждать.

1

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