Pruebas Unitarias para Método de Eliminación en Bases de Datos
Resumen
¿Cómo probar el método de eliminar en la aplicación?
Probar el método de eliminar elementos de una base de datos es crucial para asegurarnos de que la aplicación funcione correctamente y no mantenga datos innecesarios. En esta clase, nos enfocamos en diseñar pruebas para verificar que los elementos eliminados efectivamente desaparezcan de la base de datos y que la operación no deje residuos ni errores.
¿Cómo crear un método de prueba?
Reutilización de Código: Puedes reutilizar métodos previamente escritos, como el de actualización, simplemente cambiando el nombre y ajustándolo a las necesidades del método eliminar.
Deja Comentarios: Utiliza comentarios para ayudarte a identificar posibles errores y descoméntalos durante las pruebas si algún problema surge.
¿Cómo implementar la eliminación en el código?
El proceso para el método de prueba del eliminar debe seguir estos pasos:
Crear el elemento a eliminar: Antes de eliminar un elemento, asegúrate de haberlo creado y confirmado su existencia en la base de datos.
Eliminar el elemento: Utiliza la ruta o método adecuado para realizar la operación de eliminación.
Verificar el estatus de la operación: Un estatus HTTP 204 indica que la operación fue exitosa sin dejar contenido, lo que es ideal en eliminación.
Confirmar la ausencia del elemento: Realiza una comprobación de la base de datos para asegurarte de que el elemento ya no existe.
// Crear el elemento$po=newPost();// Verificar creación del elemento$this->assertNotNull($po);// Eliminar el elemento$this->post('/ruta/hacia/eliminar',['id'=>$po->id]);// Verificar que el estatus es 204$this->assertEquals(204,$response->getStatusCode());// Confirmar que el elemento ya no está en la BD$this->assertNull(Post::find($po->id));
¿Cómo asegurar que la eliminación sea efectiva y segura?
Revisar Estado de Respuesta HTTP: Asegúrate siempre de recibir un HTTP 204 tras la eliminación, lo que indica que la acción fue completada sin contenido.
Probar el No-Existente: Realiza una verificación final para confirmar que el dato eliminado realmente no existe en la base de datos mediante una búsqueda o consulta.
¿Qué hacer si la eliminación no funciona?
Revisión de Métodos y Rutas: Verifica que el método utilizado y la ruta sean correctos y efectivamente conduzcan a la eliminación del elemento.
Depuración: Si la eliminación no se ha realizado, examina el código para asegurarte de que responda adecuadamente a la operación de eliminación esperada.
Respuesta personalizada: Aunque no obligatorio, puedes configurar una respuesta JSON para el frontend que personalice el mensaje recibido tras la eliminación.
Consejo: Mantén siempre tus pruebas actualizadas y configuradas para detectar errores pronto y facilitar la actualización del código. ¡Con todas estas herramientas, tendrás un método de eliminar robusto y confiable!
El test contiene:
-> Creas el metodo de test
-> Creas del post
-> Eliminamos eliminas el post
-> Verificas que no exista en la DB
Crea el test del delete post
Corre el test y saldra en rojo
Configura el metodo para eliminar desde el controller
Corre el test y saldra en verde
Agregue el método de eliminar con un post que no existe:
publicfunctiontest_404_delete(){//creo el post$post=factory(Post::class)->create();//trato de eliminar un post que no existe$response=$this->json('DELETE',"/api/posts/1000");//espero estatus 404$response->assertStatus(404);//verifico que en realidad el post no existe en la base $this->assertDatabaseMissing('posts',['id'=>1000]);}
En resumen, lo que se hizo fue crear un nuevo post usando Fatories, recuerden que los factories insertan datos ficticios en la base de datos, enntonces, usando ese post falso creado es como probamos que la ruta DELETE funciona
Me imagino que un test deberia tener mas datos para verificar y enviar antes de decir que esta terminado, cual los cursos de testing podria tener de manera practica todos estos datos?
publicfunctiontest_delete(){// Con esto vemos el mensaje del error $this->withoutExceptionHandling();// Primero se crea el post $post =Post::factory()->create();// Sec rea la función de eliminar $response = $this->json('DELETE',"api/posts/$post->id");// Se crean las validaciones $response->assertSee(null)->assertStatus(204);//sin contenido// Con el assertDatabaseMissing decimos que esto no existe en la base de datos. $this->assertDatabaseMissing('posts',['id'=> $post->id]);}
Que bonito código, muy limpio.
Como seria la prueba si la tabla post emplea SoftDelete ?
Cuando empleas "SoftDelete", en la tabla se crea una columna adicional que se llama "deleted_at", en ese caso tienes que verificar si es NULL o no, es decir:
Cuando deleted_at tiene asignada una fecha, ese dato ya está eliminado.
Cuando deleted_at es NULL, entonces no ha sido eliminado.
¿Cual sería la diferencia entre estas pruebas que están dentro de la categoría de Feature Test contra las Unit Test?
Unit Testing se enfoca en probar la funcionalidad de una pequeña parte de la aplicación. Los** Feature Test** son para probar una característica entera (feature) de tu aplicación.
/*
1.Crear un post con factory.
2.Configuro la solicitud para eliminar el post con el ID
pasado por la ruta de eliminación.
3.Verificar que la respuesta este null y el status sea 204
4.verificar que el id no se encuentra en la base de datos.
Nota:$response->assertSee(null) ->Afirma que el string dado esta contenido en la respuesta.
*/publicfunctiontest_delete(){// Llamada al manejador de errores para mostrar de manera más concisa la falla.// $this->withoutExceptionHandling(); $post =factory(Post::class)->create(); $response = $this->json('DELETE',"api/posts/$post->id"); $response->assertSee(null)->assertStatus(204);//Sin contenido.. $this->assertDatabaseMissing('posts',['id'=> $post->id]);}