Prueba funciones de forma interactiva

El shell de Cloud Functions proporciona un shell interactivo para invocar funciones con datos de prueba. La shell admite todos los tipos de activadores.

Configura las credenciales de administrador (opcional)

Si quieres que tus pruebas de funciones interactúen con las APIs de Google o con otras APIs de Firebase mediante el SDK de Firebase Admin, es posible que debas configurar las credenciales de administrador.

  • Los activadores de Cloud Firestore y Realtime Database ya tienen las credenciales necesarias y no requieren una configuración adicional.
  • Se deben seguir los pasos de configuración descritos en esta sección para todas las otras APIs, incluidas las de Firebase, p. ej.: Authentication y FCM, o las de Google, como Cloud Translation o Cloud Speech. Esto se aplica si usas la shell de Cloud Functions o firebase emulators:start.

Para configurar las credenciales de administrador para las funciones emuladas, sigue estos pasos:

  1. Abre el panel Cuentas de servicio de la consola de Google Cloud.
  2. Asegúrate de seleccionar la cuenta de servicio predeterminada de App Engine. En las opciones de menú del lado derecho, elige Crear clave.
  3. Cuando se te solicite, selecciona JSON para el tipo de clave y haz clic en Crear.
  4. Configura las credenciales predeterminadas de Google para apuntar a la clave descargada:

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

Después de completar estos pasos, tus pruebas de funciones pueden acceder a las APIs de Google y Firebase a través del SDK de Admin. Por ejemplo, cuando pruebes un activador de Authentication, la función emulada podría llamar a admin.auth().getUserByEmail(email).

Entrega funciones con una shell de Cloud Functions

La shell de Cloud Functions emula todo tipo de activadores de funciones con una shell interactiva para invocar las funciones con datos de prueba. Las opciones varían según el tipo de función, pero el formato de uso básico es el siguiente:

myFunctionName(data, options)

El parámetro data es obligatorio para los activadores de Realtime Database, Cloud Firestore y PubSub, y es opcional para todos los otros tipos de funciones. Además, el parámetro opcional options es válido solo para las funciones de Realtime Database y Cloud Firestore.

De manera opcional, si deseas cargar datos de prueba de un archivo local, puedes guardar el archivo como una variable y, luego, invocar una función con él:

var data = require('./path/to/testData.json');
myFunction(data);

Instala y configura la shell de Cloud Functions

Para usar esta función, firebase-tools debe tener, como mínimo, la versión 3.11.0 y el SDK de firebase-functions debe tener, como mínimo, la versión 0.6.2. Para actualizar ambos, ejecuta los siguientes comandos en el directorio functions/ del proyecto:

npm install --save firebase-functions@latest
npm install -g firebase-tools

Si usas variables de configuración de funciones personalizadas, primero ejecuta el comando para obtener la configuración personalizada (ejecútalo dentro del directorio functions) en tu entorno local:

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

Por último, ejecuta la shell con el siguiente comando:

firebase functions:shell

Invoca funciones HTTPS

Si quieres invocar funciones HTTPS en el shell, el uso es el mismo que para el módulo request de NPM, pero debes reemplazar request por el nombre de la función que quieres emular. Por ejemplo:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

Invoca funciones HTTPS que admiten llamadas

Cuando ejecutes funciones HTTPS que admiten llamadas de manera local, deberás proporcionar datos de prueba adecuados.

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

De manera opcional, puedes pasar un Firebase-Instance-ID-token como el segundo parámetro. Este parámetro debe ser una string.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

La emulación de context.auth no está disponible por el momento.

Invoca funciones de Realtime Database

Cuando ejecutes funciones de Realtime Database de manera local, deberás proporcionar los datos de prueba adecuados. Por lo general, esto significa que debes proporcionar datos de prueba nuevos para las operaciones onCreate, datos antiguos o quitados para las operaciones onDelete y ambos para las funciones onUpdate o onWrite:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

Además de las opciones before/after, la shell proporciona la opción params para usarla en simulaciones de comodines en una ruta de acceso, como en este ejemplo:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

Según la configuración predeterminada, la shell ejecuta funciones de Realtime Database con privilegios de administrador (cuenta de servicio). Usa la opción auth para ejecutar funciones como un usuario final en particular o como un usuario no autenticado. Por ejemplo:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

Invoca funciones de Firestore

Cuando ejecutes funciones de Firestore de manera local, deberás proporcionar los datos de prueba adecuados. Por lo general, esto significa que debes proporcionar datos de prueba nuevos para las operaciones onCreate, datos antiguos o quitados para las operaciones onDelete y ambos para las funciones onUpdate o onWrite. Ten en cuenta que los datos de Firestore deben ser pares clave-valor. Consulta Tipos de datos admitidos.

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

Además de los campos before/after del objeto data, puedes usar los campos params del objeto options para simular comodines en un nombre de un documento. Por ejemplo:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

La shell siempre ejecuta funciones de Firestore con privilegios de administrador, lo que significa que simula un evento create/update/delete como si lo realizara un usuario administrador.

Invoca funciones de PubSub

En el caso de las funciones de PubSub, inserta tu carga útil de mensaje en una instancia de Buffer y, de forma opcional, agrega atributos de datos como se muestra a continuación:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

Invoca funciones de Analytics

Para invocar una función de Analytics sin datos, ejecuta myAnalyticsFunction() en la shell. Para ejecutar la función con datos de prueba, se recomienda definir una variable para los campos de datos de eventos específicos que necesita tu función:

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

Invoca funciones de Storage y Auth

Para las funciones de Storage y Auth, invoca la función local con los datos de prueba que quieres ver dentro de la función. Los datos de la prueba deben seguir los formatos de datos correspondientes:

Especifica solo los campos de los que depende tu código o no especifiques campos si solo deseas ejecutar la función.