我正在写phpunit测试。我写了这个测试:
public function testValidationFailure(){
$new_item_data = ['bad_param' => 'fancy_name'];
$response =
$this->withHeaders(['identifier' => "identifier"])
->post("localhost/item", $new_item_data);
$response->assertStatus(Response::HTTP_FOUND);
echo "status:" . $response->status();
}
我在api.php中有这个
Route::middleware('ensure.token')->resource('item', ItemController::class)->only(['store', 'destroy', 'update']);
控制器看起来像这样:
class ItemController extends Controller{
public function store(Request $request): JsonResponse{
try{
$request->validate(['name' => 'required']);
//code to insert new row in table
} catch(Exception $e){
return response()->json(['error' => "could_not_save_item"], Response::HTTP_INTERNAL_SERVER_ERROR);
}
现在,为什么返回的状态等于“302”?我希望另一个代码,更像是“验证失败”。302是“HTTP_FOUND”,对我来说听起来不像是错误。
当验证失败时,我如何接管并发送一个更有意义的http代码?或者为什么laravel返回这个奇怪的http代码?
1条答案
按热度按时间s4n0splo1#
这是因为您在测试中使用的是
->post()
,而不是->jsonPost()
。使用post
执行Accept: text/html
的请求,而使用jsonPost
执行Accept: application/json
的请求。当遇到验证失败时,laravel会在内部有条件地询问是否应该返回json。如果应该返回json,它会生成一个422 Unprocessable Entity响应。如果不应该,它会默认使用302 Found重定向到前一个url。
将
->post()
更改为->jsonPost()
应该可以修复您的测试。