Collega la tua app all'emulatore di Realtime Database

Prima di connettere l'app all'emulatore Realtime Database, assicurati di comprendere il flusso di lavoro generale Firebase Local Emulator Suite, e di installare e configurare Local Emulator Suite e di esaminare i relativi comandi CLI.

Scegliere un progetto Firebase

Il Firebase Local Emulator Suite emula i prodotti per un singolo progetto Firebase.

Per selezionare il progetto da utilizzare, prima di avviare gli emulatori, esegui firebase use nella CLI nella directory di lavoro. In alternativa, puoi passare il --project flag a ogni comando dell'emulatore.

Local Emulator Suite supporta l'emulazione di progetti Firebase reali e progetti dimostrativi.

Tipo di progetto Funzionalità Utilizzo con gli emulatori
Reale

Un progetto Firebase reale è un progetto che hai creato e configurato (molto probabilmente tramite la Firebase console).

I progetti reali hanno risorse attive, come istanze di database, bucket di archiviazione, funzioni o qualsiasi altra risorsa configurata per quel progetto Firebase.

Quando lavori con progetti Firebase reali, puoi eseguire gli emulatori per uno o tutti i prodotti supportati.

Per tutti i prodotti che non stai emulando, le tue app e il tuo codice interagiranno con la risorsa attiva (istanza di database, bucket di archiviazione, funzione e così via).

Demo

Un progetto Firebase dimostrativo non ha una configurazione Firebase reale e non ha risorse attive. In genere, si accede a questi progetti tramite codelab o altri tutorial.

Gli ID progetto per i progetti dimostrativi hanno il prefisso demo-.

Quando lavori con progetti Firebase dimostrativi, le tue app e il tuo codice interagiscono con gli emulatori solo. Se la tua app tenta di interagire con una risorsa per la quale non è in esecuzione un emulatore, il codice non verrà eseguito.

Ti consigliamo di utilizzare i progetti dimostrativi, se possibile. I vantaggi includono:

  • Configurazione più semplice, poiché puoi eseguire gli emulatori senza mai creare un progetto Firebase
  • Maggiore sicurezza, poiché se il codice richiama accidentalmente risorse non emulate (di produzione), non c'è alcuna possibilità di modifica dei dati, utilizzo e fatturazione
  • Migliore supporto offline, poiché non è necessario accedere a internet per scaricare la configurazione dell'SDK.

Instrumentare l'app per comunicare con gli emulatori

SDK per Android, piattaforme Apple e web

Configura le classi di test o la configurazione in-app per interagire con il Realtime Database nel seguente modo.

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val database = Firebase.database
database.useEmulator("10.0.2.2", 9000)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.useEmulator("10.0.2.2", 9000);
Swift
    // In almost all cases the ns (namespace) is your project ID.
let db = Database.database(url:"http://127.0.0.1:9000?ns=YOUR_DATABASE_NAMESPACE")

Web

import { getDatabase, connectDatabaseEmulator } from "firebase/database";

const db = getDatabase();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  connectDatabaseEmulator(db, "127.0.0.1", 9000);
} 

Web

var db = firebase.database();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  db.useEmulator("127.0.0.1", 9000);
} 

Non è necessaria alcuna configurazione aggiuntiva per testare Cloud Functions attivate da eventi di Realtime Database utilizzando l'emulatore. Quando gli emulatori di Realtime Database e Cloud Functions sono entrambi in esecuzione, funzionano automaticamente insieme.

Admin SDKs

Gli Firebase Admin SDK si connettono automaticamente all'emulatore Realtime Database quando è impostata la variabile di ambiente FIREBASE_DATABASE_EMULATOR_HOST:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Se il codice è in esecuzione all'interno dell'Cloud Functions emulatore, l'ID progetto e altre configurazioni verranno impostati automaticamente quando chiami initializeApp.

Se vuoi che il codice Admin SDK si connetta a un emulatore condiviso in esecuzione in un altro ambiente, devi specificare lo stesso ID progetto che hai impostato utilizzando l'interfaccia a riga di comando di Firebase. Puoi passare un ID progetto direttamente a initializeApp o impostare la variabile di ambiente GCLOUD_PROJECT.

SDK Admin di Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variabile di ambiente
export GCLOUD_PROJECT="your-project-id"

Cancellare il database tra i test

Per svuotare il Realtime Database tra le attività, puoi cancellare il riferimento al database. Puoi utilizzare questo approccio in alternativa alla semplice chiusura del processo dell'emulatore.

Kotlin
// With a DatabaseReference, write null to clear the database.
database.reference.setValue(null)
Java
// With a DatabaseReference, write null to clear the database.
database.getReference().setValue(null);
Swift
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

Web

import { getDatabase, ref, set } from "firebase/database";

// With a database Reference, write null to clear the database.
const db = getDatabase();
set(ref(db), null);

Web

// With a database Reference, write null to clear the database.
firebase.database().ref().set(null);

Naturalmente, il codice deve attendere la conferma che lo svuotamento sia stato completato o non sia riuscito utilizzando le funzionalità di gestione degli eventi asincroni della piattaforma.

Dopo aver implementato un passaggio di questo tipo, puoi sequenziare i test e attivare le funzioni con la certezza che i dati precedenti verranno eliminati tra le esecuzioni e che stai utilizzando una configurazione di test di base aggiornata.

Importazione ed esportazione di dati

Gli emulatori di database e Cloud Storage for Firebase ti consentono di esportare i dati da un'istanza dell'emulatore in esecuzione. Definisci un insieme di dati di base da utilizzare nei test delle unità o nei flussi di lavoro di integrazione continua, quindi esportalo per condividerlo con il team.

firebase emulators:export ./dir

Nei test, all'avvio dell'emulatore, importa i dati di base.

firebase emulators:start --import=./dir

Puoi indicare all'emulatore di esportare i dati all'arresto, specificando un percorso di esportazione o semplicemente utilizzando il percorso passato al flag --import.

firebase emulators:start --import=./dir --export-on-exit

Queste opzioni di importazione ed esportazione dei dati funzionano anche con il comando firebase emulators:exec. Per saperne di più, consulta il riferimento ai comandi dell'emulatore.

Visualizzare l'attività delle regole di sicurezza

Durante i cicli di prototipazione e test, puoi utilizzare gli strumenti di visualizzazione e i report forniti da Local Emulator Suite.

Visualizzare le valutazioni delle regole

Quando aggiungi regole di sicurezza al prototipo, puoi eseguirne il debug con Local Emulator Suite strumenti.

Dopo aver eseguito una serie di test, puoi accedere ai report sulla copertura dei test che mostrano come è stata valutata ciascuna delle tue regole. Per ottenere i report, esegui una query su un endpoint esposto nell'emulatore durante l'esecuzione. Per una versione compatibile con il browser, utilizza il seguente URL:

http://localhost:9000/.inspect/coverage?ns=<database_name>

Le regole vengono suddivise in espressioni e sottoespressioni su cui puoi passare il mouse per visualizzare ulteriori informazioni, tra cui il numero di esecuzioni e i valori restituiti. Per la versione JSON non elaborata di questi dati, includi il seguente URL nella query:

http://localhost:9000/.inspect/coverage.json?ns=<database_name>

Cosa devo fare adesso?