前回のログインのテストに対して、今回はログアウトのテスト。
まず、以下を見てください。
/** @test */ public function logout() { // ユーザーを1つ作成 $user = factory(User::class)->create(); // 認証済み、つまりログイン済みしたことにする $this->actingAs($user); // 認証されていることを確認 $this->assertTrue(Auth::check()); // ログアウトを実行 $response = $this->post('logout'); // 認証されていない $this->assertFalse(Auth::check()); // Welcomeページにリダイレクトすることを確認 $response->assertRedirect('/'); }
前回と違うのは、ログインの実行$response = $this->post(..)
が今回のテストにはないことです。その代わりに、actingAs()
を利用して、プログラムで認証済みにしてしまいます。
actingAs()
のおかげで、コードが短くなりわかりやすくなっただけでなく、その使用では以下のようにセッション値を入れたり、リダイレクトすることも可能です。認証された後の、つまりパスワード保護された中の機能のテストではいつも必要なことなので、将来重宝しそうです。
.. $response = $this->actingAs($user) ->withSession(['foo' => 'bar']) ->get('/'); ...
さて、テストとは関係ないですが、ログアウト後はどうして、/loginでなく/にリダイレクトされるのでしょう?また、その変更は可能なのでしょうか?
リダイレクト先は、残念ながら、以下のlaravelのパッケージの中のファイルでハードコードされています。
vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticateUsers.php
... /** * Log the user out of the application. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function logout(Request $request) { $this->guard()->logout(); $request->session()->invalidate(); return redirect('/'); } ...
上のファイルは編集するべきではありません。しかし、ログアウト後のリダイレクト先を変更したいなら、
app/Http/Controllers/Auth/LoginController.php
に、上のlogout
のコードを追加して、リダイレクト先を編集すればよいです。親のメソッドが上書きされて変更されることになります。use Illuminate\Http\Request;
の行の追加も忘れないように。以下に全コードを掲載します。
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */ use AuthenticatesUsers; /** * Where to redirect users after login. * * @var string */ protected $redirectTo = '/home'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest')->except('logout'); } /** * Log the user out of the application. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function logout(Request $request) { $this->guard()->logout(); $request->session()->invalidate(); return redirect('/'); } }
最後に今回のテストのコードは以下から利用可能です。
https://github.com/lotsofbytes/larajapan/blob/5.4-test/tests/Feature/LoginTest.php
メルマガ購読の申し込みはこちらから。