我有一个请求类,该类对于发布请求失败。当我用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
FormRequest
上的验证失败时,它将检查请求是否为ajax或是否接受json响应。如果是这样,它将返回带有422状态代码的json响应。如果不是,它将返回重定向到指定的URL(默认为以前的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);
对于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']
]);