まえがき
GuzzleHttpを利用してHTTPリクエストをしている処理のユニットテストを書きたい。
GuzzleHttpにはレスポンスをモック化する機能が用意されているようなので、こちらを利用してみることにします。
実装例
HogeTest.php
<?php
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Client;
class HogeTest extends \Codeception\Test\Unit
{
/**
* @group guzzletest
*/
public function testGuzzleTest()
{
/* Arrange */
$response = new Response(200, [], 'Response Body');
$mock = new MockHandler([$response]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$url = 'http://localhost:8080/';
$params = [
'token' => 'hogehoge'
];
/* Act */
$res = $client->post($url, ['form_params' => $params]);
/* Assert */
$this->assertEquals('Response Body', $res->getBody());
}
}
実行結果
$ vendor/bin/codecept run unit --group guzzletest -c common/
Codeception PHP Testing Framework v3.0.2
Powered by PHPUnit 8.2.4 by Sebastian Bergmann and contributors.
Running with seed:
[Groups] guzzletest
Common\tests.unit Tests (1) -----------------------------------------------------------
✔ HogeTest: Guzzle test (0.04s)
---------------------------------------------------------------------------------------
Time: 1.96 seconds, Memory: 32.00 MB
OK (1 test, 1 assertion)
- 上記例では、テストコードで直接クライアントを作成している
- GuzzleHttpを利用しているServiceクラスやcomponentのテストを行う場合、setClient()などを実装していれば、MockHandlerで生成したClientをテストコードからセットしてレスポンスをモック化する
つまりGuzzleはとても便利。。