Contenido del curso
Conociendo Cypress
Validando el contenido de la respuesta
Haciendo diferentes tipos de peticiones
Bases de Datos
Prueba en conjunto
Próximos pasos
Crear e insertar registros en MongoDB con Cypress
Resumen
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.
- Validar que
results.acknowledgedsea igual atrue. - Validar que el resultado tenga la propiedad
insertedIdconto.have.own.property('insertedId'). - Loguear el resultado con
console.logdurante 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.
- Confirmas que la API responde con la información correcta.
- Confirmas que la base de datos refleja los cambios reales que la API dice haber hecho.
- Detectas inconsistencias entre la capa de servicio y la capa de persistencia.
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.
- Implementa una función
updatePlanetque reciba el ID y los nuevos valores. - Implementa una función para eliminar un solo planeta a partir de su ID.
- Recuerda almacenar el
insertedIdque devuelveinsertOnepara 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
- insertOne es el método de MongoDB para crear un documento individual dentro de una colección [01:05].
- La respuesta de insertOne incluye
acknowledgedeinsertedId, datos útiles para aserciones [02:30]. - remove con
{}borra todos los documentos de la colección, ideal para resetear datos entre pruebas [04:10]. - cy.task permite ejecutar funciones de Node desde Cypress, conectando el navegador con la base de datos [01:50].
- to.have.own.property es la aserción de Chai para validar la existencia de una propiedad específica en un objeto [03:05].
¿Te animas a compartir tu implementación de update y delete? Cuéntame en los comentarios qué decisiones tomaste al diseñar tus funciones.