La prueba de phpunit devuelve 302 por mala validación, ¿por qué no 422?

Resuelto cre8 asked hace 54 años • 2 respuestas

Tengo una clase de solicitud que falla en una solicitud de publicación. Cuando lo llamo con ajax me sale un 422 porque fallaron las reglas de validación. Pero cuando uso phpunit para realizar pruebas para la misma ruta con los mismos valores, devuelve un 302.

Tampoco recibo mensajes de error como "se requiere el campo foobar", solo el 302.

Entonces, ¿cómo puedo hacer que aparezcan mensajes de error para comprobar si son iguales o no?

Aquí está mi código de prueba:

//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
cre8 avatar Jan 01 '70 08:01 cre8
Aceptado

Cuando falla la validación FormRequest, verifica si la solicitud fue ajax o si acepta una respuesta json. Si es así, devolverá una respuesta json con el código de estado 422. De lo contrario, devolverá una redirección a una URL especificada (anterior, por defecto). Entonces, para obtener la respuesta en caso de falla que está buscando (422), debe realizar una solicitud json o una solicitud ajax.

JSON

Para realizar una solicitud json, debes utilizar el json()método:

//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);

También hay métodos getJson(), postJson(), putJson(), patchJson()y deleteJson()de acceso directo si cree que se ven más limpios que pasar el método como parámetro.

//post exam
$this->postJson('modul/foo/exam', [
        'date' => '2016-01-01'
    ])
    ->assertResponseStatus(200);

AJAX

Para realizar una solicitud ajax, debe agregar los encabezados ajax. Para ello, puedes seguir utilizando el post()método:

//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);
patricus avatar Jan 27 '2016 08:01 patricus

Para Laravel 6 esto funciona:

withHeaders(['Accept' => 'application/json'])

Para un ejemplo:

 $this->withHeaders(['Accept' => 'application/json'])
     ->post(route('user.register'), $data)
     ->assertStatus(422)
     ->assertJson($expectedResponse);

Si es necesario para varias clases de prueba, se puede colocar tests/TestCase.phpy configurar para todos los casos de prueba.

Para un ejemplo:

public function setup(): void
{
    $this->withHeaders([
        'Accept' => 'application/json',
        'X-Requested-With' => 'XMLHttpRequest'
    ]);
}

Los encabezados establecidos tests/TestCase.phpse pueden ampliar en cualquier punto del mismo modo. Para un ejemplo:

$this->withHeaders([
    'Authorization' => 'Bearer '.$responseArray['access_token']
]);
azurecorn avatar Dec 19 '2019 16:12 azurecorn