Actualización de Datos en Controladores: Método y Pruebas
Resumen
¿Cómo implementar el método de actualización en un controlador?
Uno de los pilares del desarrollo de software efectivo es la capacidad de actualizar y gestionar datos de manera precisa y coherente. Al trabajar con controladores en el marco de pruebas, establecer un método de actualización es crucial. Aquí abordaremos cómo implementar este método mientras nos aseguramos de que cada test sea independiente y robusto. ¡Comencemos!
¿Cómo se estructura el método de actualización?
El método de actualización sigue una estructura muy similar al de creación. Es importante entender que cada método en un controlador debe funcionar de manera independiente. Esto significa que cada método necesita su propia línea de creación y pruebas, asegurando así la integridad y consistencia de los datos.
Código para implementar el método
Para implementar el método de actualización, puedes reutilizar algunos elementos del método Store, ajustándolos para enfocarse en la actualización:
publicfunctionupdate(Request$request,$id){$pos=Pos::find($id);// Encuentra el registro mediante su ID.$pos->update($request->all());// Actualiza con los datos recibidos en la solicitud.returnresponse()->json($pos);// Retorna el objeto actualizado en formato JSON.}
¿Cuáles son las mejores prácticas para las pruebas?
Cuando pruebas el método de actualización, es esencial verificar los cambios en los datos actualizados y asegurarte de que el sistema responde adecuadamente a fallos potenciales.
Pasos a seguir
Creación del objeto original: Antes de actualizar un objeto, asegúrate de que esté previamente creado. Esto se puede realizar con un método de factoría.
Prueba de la actualización: Utiliza el método put para modificar un objeto y verifica que efectivamente los cambios se reflejan en tu base de datos.
Validación de la respuesta: El método debe verificar que los datos actuales del objeto reflejen los cambios, y no los datos originales.
Pruebas de errores y protección de código: Asegúrate de que cualquier error sea bien documentado y que tus métodos de validación estén actualizados.
¿Cómo solucionar errores en el proceso de actualización?
Los errores son parte natural del desarrollo y las pruebas te permitirán identificarlos rápidamente.
Resolución de errores comunes
Error en la actualización del objeto: Asegúrate de que los datos que recibes son los correctos y que tu método de actualización está bien configurado.
Errores de validación: Puedes utilizar herramientas para buscar claramente cada línea que origina un error, y actualizar el método de validación eficientemente.
Finalmente, recuerda que compartir y comentar tu código con otros desarrolladores o en la documentación del proyecto puede ser muy valioso para recibir feedback y mejorar continuamente tus prácticas de desarrollo. ¡Sé constante en la práctica y sigue explorando el fascinante mundo del desarrollo de software!
Para esta clase se hizo el test de update que consta de
Crear un post con factory
Actualizarlo mediante una peticion PUT, encontrandolo mediante su ID y enviando la key con el valor
Verificando estructura del json, valor y key, y status ok
Verificando el valor y la key en la DB
Pare nada más correr un sólo test en Laravel 8.x, podemos usar:
php artisan test --filter test_update
publicfunctionupdate(PostRequest $request,Post $post){ $post->update($request->all());returnresponse()->json($post);}//testpublicfunctiontest_update_posts(){ $post =factory(Post::class)->create(); $response = $this->json('PUT',"/api/posts/$post->id",['title'=>'Post editado']); $response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>'Post editado'])->assertStatus(Response::HTTP_OK);//Ok, se ha creado un recurso $this->assertDatabaseHas('posts',['id'=> $post->id,'title'=>'Post editado']);}
Test para cada método.
Se utiliza el parámetro --filter y el nombre del método, para enfocarnos en realizar la pruebas de un método específico.
php vendor/phpunit/phpunit/phpunit --filter test_update
El parámetro --filter también funciona para el comando
php artisan test
Un poco obvio pero no está de más comentarlo
PostControllerTest
publicfunctiontest_update(){// $this->withoutExceptionHandling(); $post =factory(Post::class)->create(); $response = $this->json('PUT',"/api/posts/$post->id",['title'=>'nuevo']); $response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>'nuevo'])->assertStatus(200);// ok $this->assertDatabaseHas('posts',['title'=>'nuevo']);}
Serian estos los unicos valores a verificar en un update de un proyecto?
Quizas no entieno bien tu pregunta, pero los compos a verificar en el Update dependen netamente del proyecto. En este caso el modelo solo tiene un campo que es el titulo, pero si hablaramos de productos tendrias precio, descripcion entre otros...
publicfunctiontest_update(){ $post =Post::factory()->create(); $response = $this->json('PUT',"/api/posts/$post->id",['title'=>'nuevo']); $response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>'nuevo'])->assertStatus(200);// OK $this->assertDatabaseHas('posts',['title'=>'nuevo']);}
Controller Test:
/**
* Feature for update a post test
*
*/publicfunctiontest_update(){ $post =factory(Post::class)->create(); $response = $this->json('PUT',"/api/posts/$post->id",['title'=>'Nuevo']); $response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>'Nuevo'])->assertStatus(200);//OK $this->assertDatabaseHas('posts',['title'=>'Nuevo']);}
<publicfunctiontest_update(){ $this->withoutExceptionHandling(); $post =factory(Post::class)->create(); $response = $this->json('PUT',"/api/posts/$post->id",['title'=>'El post de edit']); $response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>'El post de edit'])->assertStatus(200);//OK, edit recurso $this->assertDatabaseHas('posts',['title'=>'El post de edit']);}>
public function test_update()
{
$this->withoutExceptionHandling();
$post =factory(Post::class)->create(); $response = $this->json('PUT',"/api/posts/$post->id",['title'=>'El post de edit']); $response->assertJsonStructure(['id','title','created_at','updated_at'])->assertJson(['title'=>'El post de edit'])->assertStatus(200);//OK, edit recurso $this->assertDatabaseHas('posts',['title'=>'El post de edit']);}
Buen día, mi duda es la siguiente:
El archivo de pruebas solicita un Json al controlador, pero que pasa en la vida real, los controller no devuelven un Json, devuelven una vista con información.
¿Hay algún tipo de pruebas que valide las vistas?
No olvides que estamos haciendo una API, esta va a regresar JSON cuando la vayamos a usar.