No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Nuevo registro

7/23
Recursos

¿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:

  1. Abrir un navegador.
  2. Visualizar un formulario.
  3. Llenar el formulario con la información necesaria.
  4. Presionar un botón para ejecutar el proceso de guardado.
  5. Realizar una redirección posterior al guardado.

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:

  • Confirma la información guardada: Utilizando la función 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!

Aportes 8

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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! 👨‍💻👩‍💻

php artisan test

Modificados:

  • tests/Feature/Http/Controllers/RepositoryControllerTest.php
    • test_store
  • app/Http/Controllers/RepositoryController.php
  • database/migrations/2021_01_11_024601_create_repositories_table.php

Tests:

    • Enviar HTTP-Post creando nuevo usuario, validar la redirección y validar su presencia en la base de datos

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!

Para que les muestre el error en la consola deben agregar la siguiente linea:

$this->withoutExceptionHandling();
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!.