Pruebas unitarias en Firebase Cloud Functions

Clase 20 de 22Curso de Firebase 5: Cloud Functions

Resumen

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 npm install --save-dev firebase-functions-test mocha
  • Crear la carpeta y el archivo de pruebas.
mkdir test # 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.js const 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.
const funciones = require('../index.js'); before(() => test.cleanup()); after(() => test.cleanup());

Puntos clave del flujo.

  • 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.

describe('enviarNotificacion test', () => { it('Enviar notificación.', (done) => { const enviarNotificacionWrap = test.wrap(funciones.enviarNotificacion); const dataAfter = test.makeDataSnapshot({ publicado: true, titulo: 'prueba unitaria', descripcion: 'prueba unitaria' }); const dataBefore = test.makeDataSnapshot({ publicado: false, titulo: 'prueba unitaria', descripcion: 'prueba unitaria' }); const cambios = test.makeChange(dataBefore, dataAfter); enviarNotificacionWrap(cambios) .then(() => done()) .catch(done); }); });

Conceptos aplicados.

  • 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.