Laravel - 测试重定向后发生的情况

2022-08-30 14:12:24

我有一个控制器,在提交电子邮件后,执行重定向到家庭,如下所示:

return Redirect::route('home')->with("message", "Ok!");

我正在为它编写测试,我不确定如何使phpunit遵循重定向,以测试成功消息:

public function testMessageSucceeds() {
    $crawler = $this->client->request('POST', '/contact', ['email' => 'test@test.com', 'message' => "lorem ipsum"]);

    $this->assertResponseStatus(302);
    $this->assertRedirectedToRoute('home');

    $message = $crawler->filter('.success-message');

    // Here it fails
    $this->assertCount(1, $message);
}

如果我用控制器上的代码替换它,并且我删除了前2个断言,它的工作原理

Session::flash('message', 'Ok!');
return $this->makeView('staticPages.home');

但我想使用.有没有办法让PHPUnit跟随重定向?Redirect::route


答案 1

您可以让PHPUnit遵循重定向:

拉拉维尔>= 5.5.19

$this->followingRedirects();

拉拉维尔< 5.4.12

$this->followRedirects();

用法:

$response = $this->followingRedirects()
    ->post('/login', ['email' => 'john@example.com'])
    ->assertStatus(200);

注意:这需要为每个请求显式设置。


对于介于这两者之间的版本

有关解决方法,请参阅 https://github.com/laravel/framework/issues/18016#issuecomment-322401713


答案 2

您可以告诉爬虫以这种方式跟踪重定向:

$crawler = $this->client->followRedirect();

所以在你的情况下,这将是这样的:

public function testMessageSucceeds() {
    $this->client->request('POST', '/contact', ['email' => 'test@test.com', 'message' => "lorem ipsum"]);

    $this->assertResponseStatus(302);
    $this->assertRedirectedToRoute('home');

    $crawler = $this->client->followRedirect();

    $message = $crawler->filter('.success-message');

    $this->assertCount(1, $message);
}

推荐