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

2022-08-30 17:02:18

我有一个请求类,对于发布请求失败。当我用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

答案 1

当 验证 失败时,它会检查请求是否为 ajax 或是否接受 json 响应。如果是这样,它将返回带有 422 状态代码的 json 响应。如果没有,它将返回重定向到指定的 url(默认情况下,上一个)。因此,为了获得有关所需故障的响应(422),您需要发出json请求或ajax请求。FormRequest

断续器

要发出 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);

还有 、、、 和快捷方式方法,如果您认为这比将方法作为参数传递更清晰。getJson()postJson()putJson()patchJson()deleteJson()

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

阿贾克斯

要发出 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);

答案 2

对于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']
]);

推荐