根据Laravel 5.6的doc,
在AJAX请求期间使用validate方法时,Laravel将不会生成重定向响应。相反,Laravel会生成JSON响应...该JSON响应将以422 HTTP状态代码发送。
我真的看不到它是否返回422。
这是我的实验摘要。
public function registerWithEmail(Request $request)
{
request()->validate([
'name' => ['required'],
'email' => ['required', 'email', 'unique:customers'],
'password' => ['required', 'min:6'],
]);
return Customer::create([
'name' => $request->input('name'),
'email' => $request->input(email),
'password' => Hash::make($request->input(password)),
]);
}
输入数据有效时,HTTP状态码为201。
但是,当它无效时,代码是302。
例如...
/** @test */
public function canNotRegisterCustomerWithSameEmail()
{
$response = $this->post('/api/register', [
'name' => 'Valid Input',
'email' => 'blah@example.com',
'password' => 'secret',
]);
$response2 = $this->post('/api/register', [
'name' => 'Duplicate Email i.e. invalid',
'email' => 'blah@example.com',
'password' => 'secret',
]);
$response->assertStatus(201);
//This is fine.
$response2->assertStatus(422);
//This fails, resulting in
//"Expected status code 422 but received 302."
$this->assertEquals(1, Customer::count());
//This is fine
}
您看到我做错了什么吗? 任何建议将不胜感激。
答案 0 :(得分:3)
您正在使用post
方法,该方法 not 不会模仿AJAX请求。对于未通过验证的常规HTTP请求,Laravel将返回302
,以便浏览器将您重定向到上一页。
要测试控制器对AJAX请求的响应,请使用json
方法:
$this->json('post', '/api/register', [
'name' => 'Duplicate Email i.e. invalid',
'email' => 'blah@example.com',
'password' => 'secret',
]);