前回のログインのテストに対して、今回はログアウトのテスト。
まず、以下を見てください。
/** @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
メルマガ購読の申し込みはこちらから。