外部APIに依存している機能を単体テストする場合、外部APIをスタブにしてダミーレスポンスを設定してテストをすることが一般的です。
今回、Laravelの単体テストにおいて外部APIに依存している部分があったのでLaravelの単体テストにおける外部APIのスタブ化について纏めました。
結論
- Http::fakeを使う事で外部APIとの通信をスタブに置き換えることができる
- 呼び出し順によって応答内容を変える場合はHttp::sequence()を使う
- Http::fakeは上書きができない
基本形
Http::fake([
'/signin' => Http::response([
'status' => 'Success'
], 200),
'*' => Http::response([
'status' => 'OK'
], 200),
]);
Http::fakeにAPIのURLごとに応答内容をHttp::responseを使って設定すればよい。
ワイルドカードも使用可能。
同じAPIを複数回呼び出す時にそれぞれで応答を変えたい場合
Http::fake([
'/signin' => Http::sequence()
->push(['status' => 'Success'], 200)
->push(['status' => 'Fail'], 400),
]);
Http::sequenceを使うことで呼び出しの順番に応じた応答を返すようにできる。
同じテストの中でfakeの設定を上書きすることはできない
Http::fake([
'/signin' => Http::response([
'status' => 'Success'
], 200)
]);
Http::fake([
'/signin' => Http::response([
'status' => 'OK'
], 200)
]);
同じAPIに対してfakeを2回呼び出しても最初に設定したレスポンス(Success)しか返ってこなかったので、上書きはできないようだ。
そのため、基本的なレスポンスはsetUpで設定しておいて、必要に応じて各テストメソッドで応答内容を上書きする、といったことはできなかった。
参考