猿问

Laravel 7 单元测试到注册路由重定向到主页

我正在使用提供的几乎完全开箱即用的注册流程Laravel 7。


当我尝试通过网络浏览器中的表单提交无效的注册表单时,我会返回到注册页面,其中包含错误列表,这正是我期望发生的情况。


但是,我正在尝试为此功能编写一个单元测试,但由于某种原因,当我在单元测试中发出相同的请求时,我得到了重定向到 root page 的响应/。


为什么我的单元测试没有返回与通过浏览器发出相同请求时相同的 HTML 响应?我怀疑这可能是由于请求中缺少发送的 CSRF 令牌,但根据文档,CSRF 中间件应该在单元测试期间被禁用。


运行测试时,CSRF 中间件会自动禁用。


这是我的单元测试代码:


public function testPostInvalidRegistration(){


    $response = $this->post("/register",[

        'first_name' => $this->faker->name

    ]);

    

    $response->dumpSession();

    $response->dump();

    $response->dumpHeaders();


}

这是输出$response->dump()


<!DOCTYPE html>\n

<html>\n

    <head>\n

        <meta charset="UTF-8" />\n

        <meta http-equiv="refresh" content="0;url='http://localhost'" />\n

\n

        <title>Redirecting to http://localhost</title>\n

    </head>\n

    <body>\n

        Redirecting to <a href="http://localhost">http://localhost</a>.\n

    </body>\n

</html>

$response->dumpSession()可以看到验证器已运行并列出了错误。



HUWWW
浏览 70回答 1
1回答

智慧大石

这就是 Laravel 的工作方式。当表单验证失败时,您将被重定向到之前的位置。由于您的测试中只有一个请求,因此没有先前的位置。后备方法是重定向到/.对于您想要的行为,您必须将referer标题设置为注册表单页面的路径。要获取表单的渲染响应,您必须遵循重定向。&nbsp; &nbsp; public function testPostInvalidRegistration()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $this->followingRedirects();&nbsp; &nbsp; &nbsp; &nbsp; $response = $this->post(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "/register",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'first_name' => $this->faker->name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ['Referer' => '/registration-form']&nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; &nbsp; &nbsp; // Assert stuff&nbsp; &nbsp; }
随时随地看视频慕课网APP
我要回答