我有一个请求类,对于发布请求失败了。当我用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
答案 0 :(得分:19)
当FormRequest
上的验证失败时,它会检查请求是否为ajax或是否接受json响应。如果是这样,它将返回带有422状态代码的json响应。如果没有,它将返回重定向到指定的URL(默认情况下为前一个)。因此,为了获得您正在寻找的失败响应(422),您需要发出json请求或ajax请求。
要发出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标头。为此,您可以继续使用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']
]);