繁体   English   中英

如果 email 未验证,如何对用户是否被重定向到登录页面进行单元测试

[英]How to unit test if the user is being redirected to login page if email not validated

我正在尝试为我的代码编写一些单元测试,我只是在学习如何编写测试,而且我是 Laravel 的新手。 基本上,我有一个简单的项目,用户应该注册并在验证他们的 email 后,他们被重定向到登录页面。 为了避免一些无限的重定向和错误,我添加了几行代码来防止用户在验证他们的 email 之前将自己重定向到登录页面。 这就是我在 controller 文件中的内容:

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

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

因此,如果用户尚未验证他的 email,如果他尝试查看只有经过身份验证的用户可以访问的刀片,我将他注销并重定向到登录页面。 尽管写这篇文章很简单,但我很难想出一个合适的方法来测试它。 我应该如何能够测试这个特定的注销部分? 我必须测试用户是否尝试输入仅身份验证刀片并检查他是否被注销并重定向到输入页面? 任何帮助将不胜感激,目前我一直在我的测试单元中尝试这样的事情:

public function test_if_user_is_logged_out()
    {
        User::factory()->create();
        $user = User::first();
        Auth::logout();
        $response = $this->actingAs($user)->get(route('landing.worldwide'));
        $response->assertRedirect(route('home'));
    }

但显然它不起作用。 我将永远感谢任何建议和帮助!

您可以将测试更新为:

public function test_an_unverified_user_is_logged_out_and_redirected()
{
    $user = User::factory()->unverified()->create();

    $this->actingAs($user)
        ->get(route('landing.worldwide'))
        ->assertRedirect(route('home'));

    $this->assertGuest();
}

unverified()是全新安装的 Laravel 中包含的一种方法。 如果您的 UserFactory 中没有UserFactory unverified() ,您可以简单地将用户创建调用更改为:

$user = User::factory()->create([
    'email_verified_at' => null,
]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM