Laravelのテストでは頻繁に$response = $this->get($url);
とか書くと思いますが、実はこれ、実際にリクエストを送信してはいません。
内部で何かごちゃごちゃとやっていて、一見リクエストを送ったように見せかけてレスポンスを返してきています。
その実害が前起こったlaravel_sessionが取れないというものですが、他にも$_SERVER['REQUEST_URI']
などの環境変数を直接使っているとテスト時に値が入ってこないので死にます。
まあ、そちらはRequest::getPathInfo()
などを使うべきだということでしょう。
本題はここからで、実はgetやpostは、外部サーバにリクエストを飛ばすことができません。
$this->get('https://example.com/a/b');
って打っても、ドメイン部分は完全に無視されてa/b
に飛びます。
なんで。
さらにLaravelをサブディレクトリ運用している場合、その外側に行くこともできません。
Laravelをhttps://example.com/laravel/
の中で運用していたとして、https://example.com/other/
にすら行けないということです。
$this->get('https://example.com/other/foo/bar');
とすると、実際はhttps://example.com/laravel/other/foo/bar
に行ってしまいます。
なんで。
内部リクエストではなく、実際に該当URLにHTTPリクエストを送る方法はないでしょうか。
URLの作成はMakesHttpRequestsやHttpFoundation\Requestのあたりで行われているのですが、読んでも全く理解できませんでした。
Laravel Duskというパッケージはあるのですが、ちょっと思ったのと違います。
これはWeb画面を表示してテキストを入力してボタンを押してといったテストを行えるようになるヘッドレスブラウザというものです。
いや、そんな高機能な代物を求めてるわけじゃないんだ。
ただただ単に外部サーバにちょっくらGETしたいだけなんだ。
こういう場合どうするのがベストな方法なんだろうか?
やっぱGuzzleとか使って手動?