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.