Guzzleは、外部のAPIとの通信によく使われます。しかし、ユニットテストの際には外部のAPIと実際に通信を行いたくない場合が多いです。
このような状況でモックを利用して、Guzzleを使ったコードのテストを行う方法を紹介します。
モックを使ったテストコードの例
以下のPHPコードは、Guzzleを使用してHTTPリクエストをモックする方法を示しています。
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
// 期待されるJSONレスポンスボディを定義
$json = [
'data' => [
'id' => 1,
'name' => 'test',
]
];
// モックレスポンスを作成
$mock = new MockHandler([new Response(200, [], json_encode($json))]);
// モックを含むハンドラースタックを作成し、クライアントに渡す
$client = new Client(['handler' => HandlerStack::create($mock)]);
// モックを使ってHTTPリクエストを行う
$response = $client->get('http://example.com');
// ステータスコードを検証
$this->assertEquals(200, $response->getStatusCode());
// レスポンスボディが期待するJSONデータであることを検証
$body = json_decode((string) $response->getBody(), true);
$this->assertEquals($json, $body);
解説
GuzzleHttp\Clientのカスタマイズ
GuzzleHttp\Client
のコンストラクタにoptions
引数を渡すことで、カスタムハンドラーを設定できます。
この例では、モック用のハンドラーを設定しています。
// モックを含むハンドラースタックを作成し、クライアントに渡す
$client = new Client(['handler' => HandlerStack::create($mock)]);
モックの作成
GuzzleHttp\Handler\MockHandler
を使ってHTTPレスポンスをモックします。
このクラスのインスタンスを作成し、コンストラクタにGuzzleHttp\Psr7\Response
オブジェクトの配列を渡します。
// モックレスポンスを作成
$mock = new MockHandler([new Response(200, [], json_encode($json))]);
レスポンスの構築
GuzzleHttp\Psr7\Response
クラスのインスタンスは、HTTPレスポンスを模倣します。
コンストラクタには、ステータスコード、ヘッダー、ボディを順番に渡します。
// 期待されるJSONレスポンスボディを定義
$json = [
'data' => [
'id' => 1,
'name' => 'test',
]
];
// モックレスポンスを作成
$mock = new MockHandler([new Response(200, [], json_encode($json))]);
これで、Guzzleを使用したユニットテストでモックを利用する方法の解説は終わりです。
モックを活用することで、実際に外部のAPIと通信することなく、コードのテストを行うことができます。