3/29

Laravel

Http:: fakeでハマった点メモ

結論

・モックする場合、同じURLのダミーレスポンスは上書きできない
・fakeで指定した文字列を接尾辞に持つURLに対してはダミーレスポンスが返ってくる (?)

補足説明

結論に書いた通りなのですが、具体例も書いておきます。

正常例

use Illuminate\Support\Facades\Http;

Http::fake([
 'example.com' => Http::response(['foo' => 'bar'], 200, ['Headers'])
]);

$response = Http::get('example.com');
$response->body()

// > "{"foo":"bar"}"

Http::fakeを実行するとその後のリクエストが実際に行われずレスポンスを偽装することができます。テストなどに便利です。URLの部分には正規表現なども使用できます。
(参考: https://readouble.com/laravel/7.x/ja/http-client.html#testing )

ハマり例1
ところで、同じURLで複数回fakeを設定すると、最初に設定した内容以外は無視されます(変数と同じで最新のものが有効だと思っていました...)

Http::fake([
 'example.com' => Http::response(['foo' => 'bar'], 200, ['Headers'])
]);

Http::fake([
 'example.com' => Http::response(['hoge' => 'fuga'], 200, ['Headers'])
]);

$response = Http::get('example.com');
$response->body()

// > "{"foo":"bar"}"

ハマり例2
また、"結論" の2つめに関してはこういうことです。

Http::fake([
 'hoge.com' => Http::response(['foo' => 'bar'], 200, ['Headers'])
]);

$response = Http::get('hogehoge.com');
$response->body()

// > "{"foo":"bar"}"

ハマり例3
上記二つが組み合わさるとまあまあ悲劇が起こります。
しばらく前にこんな感じの状況があって、まさかここに原因があるとは思わず解決に時間がかかってしまいました

Http::fake([
 'example.com' => Http::response(['foo' => 'bar'], 200, ['Headers'])
]);

// ↓無効
Http::fake([
 'subdomain.example.com' => Http::response(['hoge' => 'fuga'], 200, ['Headers'])
]); 

$response = Http::get('subdomain.example.com');
$response->body()

// > "{"foo":"bar"}"

正常例?
接頭辞の場合は大丈夫なようです

Http::fake([
 'localhost:8080' => Http::response(['foo' => 'bar'], 200, ['Headers'])
]);

// ↓有効
Http::fake([
 'localhost:8080/index' => Http::response(['hoge' => 'fuga'], 200, ['Headers'])
]);

$response = Http::get('localhost:8080/index');
$response->body()

// > "{"hoge":"fuga"}"


以上です。
気が向いたら内部実装とかを見ようと思います。

この記事が気に入ったらサポートをしてみませんか?