ユニットテストでGuzzleを使うときにモックを使う方法

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と通信することなく、コードのテストを行うことができます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください