Contenido del curso
0:00/7:39
Automatizar pruebas sobre bases de datos no relacionales como MongoDB requiere funciones específicas para crear, insertar y eliminar registros desde Cypress. Aquí aprenderás a construir esas funciones reutilizables y a validarlas con aserciones reales sobre una colección de planetas.
¿Cómo crear una función para insertar registros en MongoDB?
La lógica parte de reutilizar el cliente de conexión y cambiar la operación que se ejecuta sobre la colección. En lugar de un find, usas un insertOne que recibe el objeto a guardar.
La función queda así, dentro del archivo de tareas:
javascript async createPlanet(planet) { const client = await connectDB(); const collection = client.db('nombreDB').collection('planets'); return collection.insertOne(planet); }
Esta función se invoca desde la prueba mediante cy.task('createPlanet', planet), donde planet es el objeto que quieres insertar. Para obtenerlo de forma rápida, puedes copiar un documento existente desde la interfaz de MongoDB, eliminar el campo _id y modificar el nombre para diferenciarlo, por ejemplo poniéndole prueba en lugar de Mercurio o Urano.
¿Qué devuelve insertOne en MongoDB? Devuelve un objeto con
acknowledged: truey uninsertedIdque confirma la creación. Es muy similar a la respuesta de una base de datos relacional.
¿Cómo validar la inserción con aserciones de Cypress?
Una vez que la tarea regresa el resultado, puedes encadenar dos aserciones clave para confirmar que el registro se creó correctamente.
results.acknowledged sea igual a true.insertedId con to.have.own.property('insertedId').console.log durante el desarrollo para inspeccionar la respuesta.Un detalle importante: si tenías una aserción previa que validaba la longitud de la colección, esa aserción fallará tras el insert porque ahora hay un registro más. La solución es ajustar o retirar esa validación cuando combinas inserción con consulta en el mismo flujo.
¿Cómo borrar todos los registros de una colección con remove?
Para dejar la base de datos limpia entre ejecuciones, necesitas una función que elimine todos los documentos de la colección. La construyes igual que las anteriores, pero usando remove con un objeto vacío como filtro.
javascript async clearPlanets() { const client = await connectDB(); const collection = client.db('nombreDB').collection('planets'); return collection.remove({}); }
El objeto vacío {} indica que no hay condición, así que la operación borra todo lo que esté dentro de la colección. Úsalo con cuidado, porque no hay vuelta atrás.
¿Qué hace remove con un objeto vacío en MongoDB? Elimina todos los documentos de la colección porque no aplica ningún filtro. Es la forma más rápida de limpiar datos de prueba.
Desde Cypress lo invocas con cy.task('clearPlanets') y al correr la prueba verás cómo el flujo selecciona, crea el registro y luego limpia la colección. Si vuelves a ejecutar el test, el conteo regresa a cero y el ciclo se repite sin acumular basura.
¿Por qué unir pruebas de API y base de datos en Cypress?
La razón principal es validar consistencia. Muchas veces lo que devuelve la API debe coincidir con lo que efectivamente quedó guardado en la base de datos.
En bases de datos no relacionales necesitas crear funciones que reciban parámetros, o incluso un plugin, porque por la forma en que está estructurado MongoDB no puedes simplemente mandar una cadena para aplicar cambios como harías en SQL.
Reto: implementa update y delete por un registro
Ya tienes las bases para extender la lógica. Te propongo dos retos para reforzar lo aprendido.
updatePlanet que reciba el ID y los nuevos valores.insertedId que devuelve insertOne para usarlo como referencia en esas operaciones.La clave está en pasar parámetros desde la prueba hacia la tarea de Cypress, manteniendo la conexión reutilizable.
Conceptos y habilidades clave de la clase
acknowledged e insertedId, datos útiles para aserciones [02:30].{} borra todos los documentos de la colección, ideal para resetear datos entre pruebas [04:10].¿Te animas a compartir tu implementación de update y delete? Cuéntame en los comentarios qué decisiones tomaste al diseñar tus funciones.