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

时间:2016-01-26 22:33:06

标签: php laravel phpunit laravel-5.2

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

我也没有得到任何错误消息,例如“只需要字段foobar”。

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

这是我的测试代码:

//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

2 个答案:

答案 0 :(得分:19)

FormRequest上的验证失败时,它会检查请求是否为ajax或是否接受json响应。如果是这样,它将返回带有422状态代码的json响应。如果没有,它将返回重定向到指定的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);

答案 1 :(得分: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']
]);