Laravel5.4 で 301 Redirect した時の挙動
目的
- ある特定のページを301 redirect させて、UnitTest を Pass させる
- Test をしているのは、Redirect ページであるため、実際に遷移したかどうかまで確認出来ていない
- Redirect ページから、正しくページ遷移されたかどうか Test を書きたいが、今はこれで必要十分
routes/web.php
<?php Route::get('/sample', function() { return redirect('/memo', 301); });
tests/Unit/MemoControllerTest.php
<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class MemoControllerTest extends TestCase { public function testMemoIndex() { $response = $this->get('/sample'); $response->assertStatus(301); $response->assertSee('<meta http-equiv="refresh" content="0;url=http://localhost/memo" />'); } }
redirect(‘/memo’, 301) と書いた時の内部的な動き
- 下のような redirect 用のページが生成される(Laravelが自動的に生成)
- page の中には 0秒で対象ページ(memo) にリダイレクトするよう、meta属性で定義
<html> <head> <meta charset="UTF-8" /> <meta http-equiv="refresh" content="0;url=http://localhost/memo" /> <title>Redirecting to http://localhost/memo</title> </head> <body> Redirecting to <a href="http://localhost/memo">http://localhost/memo</a>. </body> </html>
疑問点
- 環境によって、meta タグ内の content=x が 0秒 / 1秒 と異なる。これが異なる理由が不明。
所感
- できればページ遷移した後の content をチェックして true を返すような Test に書き換えたい
- まさか内部的に Redirect 用のページを挟んでいるとは思ってもいなかったので、Test によって Framework の理解が少し深まった。
全然関係ないけど
Hatena の Markdown で言語を引用する場合、<?php ってかかないとPHPと認識されないみたい。
たしかに class だけ書いてたらわからないよね。