phpunit测试返回302进行错误验证,为什么不返回422

问题描述 投票:14回答:2

我有一个请求类,该类对于发布请求失败。当我用ajax调用它时,我得到422,因为验证规则失败。但是,当我使用phpunit测试具有相同值的相同路由时,它将返回302。

我也没有收到类似“需要字段foobar之类的错误消息,只是302。

所以如何获取错误消息以检查它们是否相等?

这是我的测试代码:

//post exam
$this->post('modul/foo/exam', [
    'date' => '2016-01-01'
])
    ->assertResponseStatus(200);

//post exam again
$this->post('modul/foo/exam', [
    'date' => '2016-01-01'
])
    ->assertResponseStatus(302); //need to get 422 with th errors because its an api
php laravel phpunit laravel-5.2
2个回答
28
投票

FormRequest上的验证失败时,它将检查请求是否为ajax或是否接受json响应。如果是这样,它将返回带有422状态代码的json响应。如果不是,它将返回重定向到指定的URL(默认为以前的URL)。因此,为了得到您要查找的失败的响应(422),您需要发出json请求或ajax请求。

JSON

要发出json请求,您应该使用json()方法:

//post exam
$this->json('POST', 'modul/foo/exam', [
        'date' => '2016-01-01'
    ])
    ->assertResponseStatus(200);

//post exam again
$this->json('POST', 'modul/foo/exam', [
        'date' => 'some invalid date'
    ])
    ->assertResponseStatus(422);

AJAX

要发出ajax请求,您需要添加ajax标头。为此,您可以继续使用post()方法:

//post exam
$this->post(, 'modul/foo/exam', [
        'date' => '2016-01-01'
    ], ['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'])
    ->assertResponseStatus(200);

//post exam again
$this->post('modul/foo/exam', [
        'date' => 'some invalid date'
    ], ['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'])
    ->assertResponseStatus(422);

0
投票

对于Laravel 6,这有效:

withHeaders(['Accept' => 'application/json'])

例如:

 $this->withHeaders(['Accept' => 'application/json'])
     ->post(route('user.register'), $data)
     ->assertStatus(422)
     ->assertJson($expectedResponse);

如果需要多个测试类,可以将其放在tests/TestCase.php中,并将为所有测试用例进行设置。

例如:

public function setup(): void
{
    $this->withHeaders([
        'Accept' => 'application/json',
        'X-Requested-With' => 'XMLHttpRequest'
    ]);
}

tests/TestCase.php中设置的那些标题可以通过相同的方式在任意点扩展。例如:

$this->withHeaders([
    'Authorization' => 'Bearer '.$responseArray['access_token']
]);
© www.soinside.com 2019 - 2024. All rights reserved.