Brian Sánchez Izquierdo
Marcos Aguirre Miñarro
¿Cómo configurar registros de datos en una base de datos usando testing?
Configurar el registro de datos en una base de datos puede parecer un reto, pero hacerlo mediante tests puede asegurar que el proceso sea impecable. En esta sección, exploraremos cómo se puede crear un registro en una base de datos realizando pruebas rigurosas. Mediante estos pasos, conseguirás no solo guardar datos de manera eficiente, sino también asegurarte de que el sistema responde adecuadamente a posibles cambios.
¿Cuál es el proceso básico para guardar datos?
Inicialmente, el proceso de guardar cualquier información en una base de datos sigue una serie de pasos:
Este flujo se puede replicar al trabajar con testing, configurando un entorno similar al real y asegurando que cada paso se realiza correctamente.
¿Cómo empleamos testing para registrar datos?
Para replicar el flujo de trabajo dentro de un test, se sigue un procedimiento estructurado:
Definir el método de testeo: Este comienza siempre con test_, seguido del nombre que describa la acción, por ejemplo, test_store.
Configurar los datos de entrada: Se crean datos ficticios usando bibliotecas como Faker para simular la información que se enviaría a través del formulario, por ejemplo, una URL o una descripción.
Simular al usuario: Crear un usuario de prueba con el que interactuará el sistema. Esto se puede hacer utilizando factory, que genera instancias de modelos en tests.
Simular el envío de datos: Utilizar un método, como POST, para enviar los datos a la ruta configurada. Se debe verificar que después de este evento, el sistema realice una redirección a la vista esperada.
// Ejemplo de cómo simular el envío de datos desde un formulario $data = [ 'url' => $faker->url, 'description' => $faker->text ]; // Crear un usuario y simular su inicio de sesión $user = factory(User::class)->create(); $this->actingAs($user); // Enviar los datos con POST a la ruta definida $this->post(route('repositorio.store'), $data) ->assertRedirect(route('repositorio.index'));
¿Cómo se verifican los datos en la base de datos?
Una vez realizado el envío, es crucial verificar que los datos realmente se guarden en la base de datos asociada. Se logra de la siguiente manera:
assertDatabaseHas, se revisa que las tablas contengan el dato exacto previamente definido en el test.// Verificar que los datos se guardaron correctamente en la base de datos $this->assertDatabaseHas('repositorios', [ 'url' => $data['url'], 'description' => $data['description'] ]);
¿Qué implica manejar errores y configuraciones adicionales?
El testing detalla errores precisos cuando una operación falla, lo cual es esencial para depurar:
Gestión de errores 500: A menudo indican configuraciones faltantes, como campos inexistentes en migraciones.
Configuración de migraciones y factories: Asegúrate de que las migraciones contengan los campos necesarios y que los factories estén ajustados para reflejar datos masivos o simulados.
// Ejemplo de ajuste en una migración para agregar campos necesarios Schema::table('repositorios', function (Blueprint $table) { $table->string('url'); $table->text('description'); });
¿Cómo finalizamos con éxito la configuración del test?
La clave para un test exitoso es asegurar que cada paso en el flujo de guardar datos sea verificado y funcione conforme a lo esperado. Cada cambio pequeño o gran ajuste requiere atención absoluta y la documentación cuidadosa de los pasos garantiza un proceso de calidad.
El resultado de una ejecución de tests completa y libre de errores proporciona la certeza de que tu configuración es robusta y funcional, más aún si introduces actualizaciones y modificaciones periódicas en tu sistema. ¡Sigue adelante y no dejes que nada se interponga en tu camino hacia un desarrollo seguro y eficiente!
Brian Sánchez Izquierdo
Marcos Aguirre Miñarro
Adrian Peralta
Marcos Aguirre Miñarro
Jimmy Buriticá Londoño
Luis Angel Murrugarra Astolingon
Edward Trigos Lopez
Julian Darío Londoño raigosa
Italo Morales Fantone
ProfesorRomulo Felizola
Eminson Mendoza
Jorge Bou-saad
Gustavo Eduardo Navarro Rodríguez
Algo interesante, no es necesario editar el Factory de Repository para que la prueba pase, solamente se necesita actualizar su migración y el modelo. Ésto es así puesto que queremos agregar campos que no existen en la base, lo cual se corrige agregando las columnas a la migración, y queremos agregar campos de manera masiva, lo cual se le informa a la Laravel a través del modelo de Repository con su propiedad fillable.
No es necesario actualizar el factory de Repository ya que el único que usamos dentro de la prueba es el de User. Los invito a hacer la prueba! 👨💻👩💻
Totalmente cierto, aunque quizás sea necesario a futuro tener el factory creado si llenamos la base de datos mediante un seeder. Yo he llegado a la misma conclusión simplemente haciendo tdd incluyendo $this->withoutExceptionHandling(); en el método del test y siguiendo los errores que me iba generando de uno en uno. Tu comentario me ayudó a ver que iba por el buen camino. Muchas gracias
php artisan test
Modificados:
Tests:
Buenas a todos! Quizás esto pueda ser de utilidad ya que para mi al menos lo está siendo. Puede que sea algo que se realice de forma habitual pero que en el caso del curso no se haga para no demorar demasiado la generación del código. Por ejemplo en el caso de esta clase si se ejecuta el test antes de crear el método store, dicho test da este error: ** • Tests\Feature\Http\Controllers\RepositoryControllerTest > store Response status code [500] is not a redirect status code. Failed asserting that false is true.** El cual no es de mucha ayuda, en principio. Pero si se añade en el código del test: $this->withoutExceptionHandling(); Entonces el error que aparece es: ** • Tests\Feature\Http\Controllers\RepositoryControllerTest > store BadMethodCallException
Method App\Http\Controllers\RepositoryController::store does not exist.** Dando quizás un detalle mayor de lo que ocurre e ir de esta forma pudiendo realizar la metodología tdd paso a paso (aunque con pasos mas pequeños) hasta llegar al ansiado verde. Muchas gracias por tan excelente curso!
Excelente aporte, realmente TDD ayuda a hacer grandes desarrollos.
Muchas Gracias por el aporte, quiero agregar que este fragmento de código $this->withoutExceptionHandling(); se añade al principio de cada metodo test
Para que les muestre el error en la consola deben agregar la siguiente linea:
$this->withoutExceptionHandling();
¿como puedo solucionar TTY mode is not supported on Windows platform. en windows?
Actualiza el instalador de Laravel
de la misma forma se crearía en una api??
Podemos hacer uso de las rutas y construir la data apartir del factory para cuando el modelo tenga muchos atributos.
Interesante, no sabia que se podia crear elementos desde las relaciones aunque es muy logico por al final eso retorna un modelo que tiene la funcion create. Yo me habia adelantado y para obtener el id del usuario habia utilizado el facades Auth y obteniendo el id de esta forma Auth::user()->id
Esto tambien es un camino pero es menos eficiente porque escribes mas lineas de codigo.
Si te pasó como a mí que cuando creaste el modelo le dijiste a artisan que creara todo (con -a) seguro te pasó que creó la clase "StoreRepositoryRequest".
Cuando vayas a hacer las pruebas mostradas en esta clase te saldrá un error de "This action is unauthorized" usando "$this->withoutExceptionHandling();".
Lo que tienes que hacer es ir al archivo "App\Http\Requests\StoreRepositoryRequest" y editar la función authorize que devuelva true en vez de false.
Saludos!.