laravel 验证失败返回302

eagi6jfj  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(308)

我正在写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代码?

s4n0splo

s4n0splo1#

这是因为您在测试中使用的是->post(),而不是->jsonPost()。使用post执行Accept: text/html的请求,而使用jsonPost执行Accept: application/json的请求。
当遇到验证失败时,laravel会在内部有条件地询问是否应该返回json。如果应该返回json,它会生成一个422 Unprocessable Entity响应。如果不应该,它会默认使用302 Found重定向到前一个url。
->post()更改为->jsonPost()应该可以修复您的测试。

相关问题