You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何单元测试未验证邮箱用户访问Auth页面的登出重定向逻辑

解决方案

你的测试失效的核心原因是:Laravel默认的User工厂创建用户时,邮箱会被自动标记为已验证(email_verified_at字段默认填充当前时间),导致控制器里的if (auth()->user()->email_verified_at)条件成立,直接返回着陆页视图,不会触发登出和重定向逻辑。

正确的测试实现步骤

  1. 创建一个邮箱未验证的测试用户
  2. 模拟登录该用户并访问目标路由
  3. 验证重定向行为,同时确认用户已被登出

修正后的测试代码

public function test_unverified_user_is_logged_out_and_redirected()
{
    // 创建邮箱未验证的用户
    $user = User::factory()->create([
        'email_verified_at' => null,
    ]);

    // 模拟登录该用户并访问着陆页路由
    $response = $this->actingAs($user)->get(route('landing.worldwide'));

    // 验证重定向到首页
    $response->assertRedirect(route('home'));

    // 验证用户已被登出(当前无认证用户)
    $this->assertGuest();
}

额外说明

  • 测试方法名尽量清晰,比如test_unverified_user_is_logged_out_and_redirected,能直观体现测试场景
  • 无需手动调用Auth::logout(),actingAs()会自动处理登录状态,测试结束后Laravel会自动重置认证环境
  • assertGuest()是Laravel测试套件提供的断言,用于验证当前没有已认证用户,确保登出逻辑确实生效

控制器代码的小优化(可选)

为避免未登录用户访问时,调用auth()->user()出现报错,可先判断用户是否已认证:

public function index(): View|RedirectResponse
{
    // 先判断是否有已登录用户
    if (!auth()->check()) {
        return redirect(route('home'));
    }

    if (auth()->user()->email_verified_at) {
        return view('landing.country', [
            'countries'  => Countries::all(),
        ]);
    }

    auth()->logout();
    return redirect(route('home'));
}

内容的提问来源于stack exchange,提问作者ceaiius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:25:24