Aprende a asegurar la calidad de tus Firebase Cloud Functions con pruebas unitarias claras, automatizadas y eficientes. Con un flujo práctico que usa Mocha y firebase-functions-test, podrás validar cambios sin miedo, detectar regresiones y profesionalizar tu desarrollo con confianza.
¿Por qué hacer pruebas unitarias en Firebase Cloud Functions?
Las pruebas unitarias verifican la mínima unidad de código: una función. Permiten cambiar el código y, al ejecutar los tests automatizados, confirmar que todo siga correcto. Esto mejora la calidad y convierte tu proceso en algo predecible y eficiente.
Conceptos clave que se aplican:
Prueba unitaria: comprobar que una función hace lo esperado.
Automatización con npm test: ejecutar todo el set de pruebas de forma simple.
Pruebas online y offline: en offline se simulan datos y respuestas con mockups y “stop”; en online se conectan a Firebase y solo se simulan los datos de entrada.
Buenas prácticas: nombrar los tests con el nombre de la función + “test”. Limpiar con test.cleanup antes y después.
¿Cómo configurar Mocha y firebase-functions-test paso a paso?
Configura el entorno de pruebas dentro de la carpeta de functions y prepara credenciales y variables de entorno para ejecutar en local, con opción de conexión a Firebase.
Pasos esenciales.
Instalar librerías de desarrollo.
cd functions
npminstall --save-dev firebase-functions-test mocha
Crear la carpeta y el archivo de pruebas.
mkdirtest# dentro de test# index.test.js
Agregar el script de pruebas en package.json.
{"scripts":{"test":"mocha"}}
Descargar credenciales: en la consola de Firebase > configuración del proyecto > cuentas de servicio > generar nueva clave privada. Renombrar a credenciales.json y colocarla en test/.
Inicializar firebase-functions-test con configuración del proyecto y credenciales.
// test/index.test.jsconst test =require('firebase-functions-test')({databaseURL:'https://TU-URL.firebaseio.com',projectId:'TU-PROYECTO',storageBucket:'gs://TU-STORAGE'},'./test/credenciales.json');
Mockear variables de entorno usadas por las funciones.
test.mockConfig({// copia aquí tus variables de runtimeConfig.});
Importar las funciones y limpiar el estado de pruebas.
Uso de wrap: test.wrap(función) crea una “envoltura” para poder llamar y evaluar la función.
Datos de prueba con la librería: makeDataSnapshot y makeChange facilitan simular eventos con before y after.
Manejo de promesas en los tests: usar done con .then y .catch.
¿Cómo escribir y ejecutar pruebas para Crashlytics y notificaciones push?
Se cubren dos casos: una función que envía SMS ante errores de Crashlytics y otra que envía una notificación push cuando un post cambia su estado de publicado.
¿Cómo probar la función de Crashlytics con datos simulados?
Objetivo: validar que el SMS se envía correctamente cuando se registra un error. Se usa wrap y un ejemplo de datos que provee la librería.
describe('nuevoErrorApp test',()=>{it('SMS enviado correctamente.',(done)=>{const nuevoErrorAppWrap = test.wrap(funciones.nuevoErrorApp);const data = test.crashlytics.exampleIssue();nuevoErrorAppWrap(data).then(()=>done()).catch(done);});});
Claves aplicadas.
Datos listos: test.crashlytics.exampleIssue() retorna un JSON de ejemplo.
Resultado esperado: la función responde sin error y el SMS es enviado.
¿Cómo probar enviar notificación con before/after usando makeChange?
Objetivo: al actualizar un documento en la colección post, si publicado pasa de false a true, se envía una notificación push.
Before y after: simular el estado previo y el nuevo estado del documento.
makeChange: agrupa ambos snapshots y dispara la función como si fuera un update real.
Validación positiva: publicado cambia de false a true y se envía la notificación.
Ejecución final.
Usa el comando que centraliza todo: npm test.
Observa el reporte de Mocha: verás cada caso descrito y su resultado.
¿Te gustaría ver más casos, como pruebas negativas o escenarios offline con mockups y “stop”? Cuéntame en los comentarios qué funciones quieres testear y qué eventos de Firebase necesitas cubrir.