はらへり日記

腹に弾丸

Guzzleのレスポンスをモック化する

ユニットテスト

ユニットテストを書く際、依存してるクラスやライブラリをモックに差し替えると思うが、PHPのHTTPライブラリであるGuzzleにはテスト用のモックを作る機能があらかじめ用意されている。

公式ドキュメントにもちょろっと案内されているが、レスポンスボディを指定する方法は載っていなかったので紹介する。

今回の想定として、request()メソッドが呼ばれた際にreturnされるHTTPレスポンスオブジェクトの内容をモック化するところを目指す。

5分でできるモックの作り方

モック化する具体的なオブジェクトは¥GuzzleHttp¥Clientにあたる。

HTTP 200 OKを返すだけのモックを作るには以下の様な感じ。

// 必要なクラスをロード
use GuzzleHttp¥Client;
use GuzzleHttp¥Handler¥MockHandler;
use GuzzleHttp¥HandlerStack;
use GuzzleHttp¥Psr7¥Response;

// モックとなるレスポンスを作成
$mockRes = new Response(200);

// モッククライアントを作成
$mock    = new MockHandler([$mockRes]);
$handler = HandlerStack::create($mock);
$mockClient = new Client(['handler' => $handler]);

// モックでrequestを実行してみる
$res = $mockClient->request('GET', 'http://example.com');
echo $res->getStatusCode(); // 200

これで意図したレスポンスを返す¥GuzzleHttp¥Clientの完成!

Responseの細かい内容をモック化する

もちろん、ステータスコードだけでなく返ってくるBody部分やHTTPヘッダーをモック化したい時もある。

そのときはResponseの引数に指定する。

これがドキュメントに載ってなくて一瞬手が止まったけどコードを読んで解決。

以下のGitHubのページに書いてあります。

guzzle/psr7

コードの該当部分を見てみるとコメントには以下のように書いてあります。

    /**
     * @param int    $status  Status code for the response, if any.
     * @param array  $headers Headers for the response, if any.
     * @param mixed  $body    Stream body.
     * @param string $version Protocol version.
     * @param string $reason  Reason phrase (a default will be used if possible).
     */

なので例えば「ステータスコード200, Body部分はJSON文字列でHTTP1.1」のレスポンスを作りたかったら以下のように書く。

$mockRes = new ¥GuzzleHttp¥Psr7¥Response(200, [], '{ hoge: moge}', '1.1');

これをGuzzleHttp¥Handler¥MockHandlerに渡せばオッケー。簡単!!

まとめ

Guzzleいい子。