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