Testare le funzioni in modo interattivo

La shell di Cloud Functions fornisce una shell interattiva per richiamare le funzioni con dati di test. La shell supporta tutti i tipi di trigger.

(Facoltativo) Configurare le credenziali di amministratore

Se vuoi che i test delle funzioni interagiscano con le API di Google o altre API Firebase tramite l'SDK Firebase Admin, potrebbe essere necessario configurare le credenziali di amministratore.

  • Cloud Firestore e Realtime Database trigger hanno già credenziali sufficienti e non richiedono una configurazione aggiuntiva.
  • Tutte le altre API, incluse le API Firebase come Authentication e FCM o le API di Google come Cloud Translation o Cloud Speech, richiedono i passaggi di configurazione descritti in questa sezione. Questo vale sia se utilizzi la shell Cloud Functions sia firebase emulators:start.

Per configurare le credenziali di amministratore per le funzioni emulati:

  1. Apri il riquadro Account di servizio della Google Cloud console.
  2. Assicurati che sia selezionato App Engine service account predefinito e utilizza il menu opzioni a destra per selezionare Crea chiave.
  3. Quando richiesto, seleziona JSON per il tipo di chiave e fai clic su Crea.
  4. Imposta le credenziali predefinite di Google in modo che puntino alla chiave scaricata:

    Unix

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

    Windows

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

Dopo aver completato questi passaggi, i test delle funzioni possono accedere a Firebase e alle API di Google utilizzando l'SDK Admin. Ad esempio, quando si testa un Authentication trigger, la funzione emulata potrebbe chiamare admin.auth().getUserByEmail(email).

Eseguire le funzioni utilizzando una shell di Cloud Functions

La shell di Cloud Functions emula tutti i tipi di trigger di funzioni con una shell interattiva per richiamare le funzioni con dati di test. Le opzioni variano in base al tipo di funzione, ma il formato di utilizzo di base è:

myFunctionName(data, options)

Il parametro data è obbligatorio per i trigger di Realtime Database, Cloud Firestore e Pub/Sub e facoltativo per tutti gli altri tipi di funzioni. Inoltre, il parametro facoltativo options è valido solo per le funzioni di Realtime Database e Cloud Firestore.

Facoltativamente, puoi caricare i dati di test da un file locale salvando il file come variabile e richiamando una funzione con esso:

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

Installare e configurare la shell di Cloud Functions

Per utilizzare questa funzionalità, firebase-tools deve avere la versione minima 3.11.0 e l'SDK firebase-functions deve avere la versione minima 0.6.2. Per aggiornarli entrambi, esegui i seguenti comandi nella directory functions/ del tuo progetto:

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

Se utilizzi variabili di configurazione delle funzioni personalizzate, esegui prima il comando per ottenere la configurazione personalizzata (esegui questo comando nella directory functions) nel tuo ambiente locale:

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

Infine, esegui la shell con il seguente comando:

firebase functions:shell

Richiamare le funzioni HTTPS

Per richiamare le funzioni HTTPS nella shell, l'utilizzo è lo stesso del request modulo NPM, ma sostituisci request con il nome della funzione che vuoi emulare. Ad esempio:

# 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' })

Richiamare le funzioni HTTPS Callable

Quando richiami le funzioni HTTPS Callable in locale, devi fornire dati di test appropriati.

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

Facoltativamente, puoi passare un Firebase-Instance-ID-token come secondo parametro. Deve essere una stringa.

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

L'emulazione di context.auth non è attualmente disponibile.

Richiamare le funzioni di Realtime Database

Quando esegui le funzioni di Realtime Database in locale, devi fornire dati di test appropriati. In genere, ciò significa fornire nuovi dati di test per le operazioni onCreate, dati precedenti/rimossi per le operazioni onDelete ed entrambi per le funzioni 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' })

Oltre alle opzioni before/after, la shell fornisce l'opzione params da utilizzare per simulare i caratteri jolly in un percorso:

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

Per impostazione predefinita, la shell esegue le funzioni di Realtime Database con privilegi di amministratore (service account). Utilizza l'opzione auth per eseguire le funzioni come un utente finale specifico o come utente non autenticato:

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

Richiamare le funzioni di Firestore

Quando esegui le funzioni di Firestore in locale, devi fornire dati di test appropriati. In genere, ciò significa fornire nuovi dati di test per le operazioni onCreate, dati precedenti/rimossi per le operazioni onDelete ed entrambi per le funzioni onUpdate o onWrite. Tieni presente che i dati di Firestore devono essere coppie chiave-valore. Consulta Tipi di dati supportati.

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

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

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

Oltre ai campi before/after dell'oggetto data, puoi utilizzare i campi params dell'oggetto options per simulare i caratteri jolly in un nome di documento:

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

La shell esegue sempre le funzioni di Firestore con privilegi amministrativi, il che significa che simula un evento di creazione/aggiornamento/eliminazione come se fosse stato eseguito da un utente amministratore.

Richiamare le funzioni di Pub/Sub

Per le funzioni di Pub/Sub, inserisci il payload del messaggio in un'istanza Buffer e aggiungi facoltativamente gli attributi dei dati come mostrato di seguito:

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

Richiamare le funzioni di Analytics

Puoi richiamare una funzione di Analytics senza dati eseguendo myAnalyticsFunction() nella shell. Per eseguire la funzione con dati di test, ti consigliamo di definire una variabile per i campi di dati degli eventi specifici di cui ha bisogno la funzione:

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);

Richiamare le funzioni di Storage e Auth

Per le funzioni di Storage e Auth, richiama la funzione locale con i dati di test che vuoi visualizzare all'interno della funzione. I dati di test devono seguire i formati di dati corrispondenti:

Specifica solo i campi da cui dipende il codice o nessuno se vuoi solo eseguire la funzione.