Pruebas unitarias en Firebase Cloud Functions
Clase 20 de 22 • Curso de Firebase 5: Cloud Functions
Contenido del curso
Consola web de administración
Extendiendo la Gestión de Usuarios con Cloud Functions.
Extendiendo Firestore con Cloud Functions.
Extendiendo el Almacenamiento con Cloud Functions.
Creando Cloud Functions HTTPS
Extendiendo el Hosting con Cloud Functions.
Extendiendo crashlytics con Cloud Functions.
Extendiendo Analytics con Cloud Functions.
Creación de pruebas unitarias a las Cloud Functions.
Optimizando las Cloud Functions.
Cierre
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.