Verbinden Sie Ihre App mit dem Realtime Database Emulator

Bevor Sie Ihre App mit dem Realtime Database-Emulator verbinden, stellen Sie sicher, dass Sie den gesamten Firebase Local Emulator Suite-Workflow verstehen , dass Sie die Local Emulator Suite installieren und konfigurieren und ihre CLI-Befehle überprüfen.

Wählen Sie ein Firebase-Projekt

Die Firebase Local Emulator Suite emuliert Produkte für ein einzelnes Firebase-Projekt.

Um das zu verwendende Projekt auszuwählen, führen Sie vor dem Starten der Emulatoren in der CLI firebase use in Ihrem Arbeitsverzeichnis aus. Alternativ können Sie das Flag --project an jeden Emulatorbefehl übergeben.

Die Local Emulator Suite unterstützt die Emulation echter Firebase-Projekte und Demoprojekte .

Projekttyp Merkmale Verwendung mit Emulatoren
Real

Ein echtes Firebase-Projekt ist eines, das Sie erstellt und konfiguriert haben (höchstwahrscheinlich über die Firebase-Konsole).

Echte Projekte verfügen über Live-Ressourcen wie Datenbankinstanzen, Speicher-Buckets, Funktionen oder jede andere Ressource, die Sie für dieses Firebase-Projekt einrichten.

Wenn Sie mit echten Firebase-Projekten arbeiten, können Sie Emulatoren für einige oder alle unterstützten Produkte ausführen.

Bei allen Produkten, die Sie nicht emulieren, interagieren Ihre Apps und Ihr Code mit der Live- Ressource (Datenbankinstanz, Speicher-Bucket, Funktion usw.).

Demo

Ein Demo-Firebase-Projekt hat keine echte Firebase-Konfiguration und keine Live-Ressourcen. Der Zugriff auf diese Projekte erfolgt normalerweise über Codelabs oder andere Tutorials.

Projekt-IDs für Demoprojekte haben das Präfix demo- .

Wenn Sie mit Firebase-Demoprojekten arbeiten, interagieren Ihre Apps und Ihr Code nur mit Emulatoren. Wenn Ihre App versucht, mit einer Ressource zu interagieren, für die kein Emulator ausgeführt wird, schlägt dieser Code fehl.

Wir empfehlen Ihnen, nach Möglichkeit Demoprojekte zu verwenden. Zu den Vorteilen gehören:

  • Einfachere Einrichtung, da Sie die Emulatoren ausführen können, ohne jemals ein Firebase-Projekt zu erstellen
  • Höhere Sicherheit, denn wenn Ihr Code versehentlich nicht emulierte (Produktions-)Ressourcen aufruft, besteht keine Chance auf Datenänderung, Nutzung und Abrechnung
  • Bessere Offline-Unterstützung, da zum Herunterladen Ihrer SDK-Konfiguration kein Zugriff auf das Internet erforderlich ist.

Instrumentieren Sie Ihre App, um mit den Emulatoren zu kommunizieren

Android-, Apple-Plattformen und Web-SDKs

Richten Sie Ihre In-App-Konfiguration oder Testklassen wie folgt für die Interaktion mit der Echtzeitdatenbank ein.

Kotlin+KTX
// 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);
Schnell
    // 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 modular API

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 namespaced API

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

Es ist keine zusätzliche Einrichtung erforderlich, um Cloud Functions , die durch Echtzeitdatenbankereignisse ausgelöst werden, mit dem Emulator zu testen. Wenn sowohl die Realtime Database- als auch die Cloud Functions-Emulatoren ausgeführt werden, arbeiten sie automatisch zusammen.

Admin-SDKs

Die Firebase Admin SDKs stellen automatisch eine Verbindung zum Echtzeitdatenbank-Emulator her, wenn die Umgebungsvariable FIREBASE_DATABASE_EMULATOR_HOST festgelegt ist:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Wenn Ihr Code im Cloud Functions-Emulator ausgeführt wird, werden Ihre Projekt-ID und andere Konfigurationen beim Aufruf initializeApp automatisch festgelegt.

Wenn Sie möchten, dass Ihr Admin-SDK-Code eine Verbindung zu einem gemeinsam genutzten Emulator herstellt, der in einer anderen Umgebung ausgeführt wird, müssen Sie dieselbe Projekt-ID angeben, die Sie mit der Firebase-CLI festgelegt haben . Sie können eine Projekt-ID direkt an initializeApp übergeben oder die Umgebungsvariable GCLOUD_PROJECT festlegen.

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

Löschen Sie Ihre Datenbank zwischen den Tests

Um die Echtzeitdatenbank zwischen Aktivitäten zu leeren, können Sie die Datenbankreferenz löschen. Sie können diesen Ansatz als Alternative zum einfachen Herunterfahren des Emulatorprozesses verwenden.

Kotlin+KTX
// 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);
Schnell
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

Web modular API

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 namespaced API

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

Natürlich sollte Ihr Code mithilfe der asynchronen Ereignisverarbeitungsfunktionen Ihrer Plattform auf die Bestätigung warten, dass der Flush abgeschlossen wurde oder fehlgeschlagen ist.

Nachdem Sie einen Schritt wie diesen implementiert haben, können Sie Ihre Tests sequenzieren und Ihre Funktionen mit der Gewissheit auslösen, dass alte Daten zwischen den Läufen gelöscht werden und Sie eine neue Basistestkonfiguration verwenden.

Daten importieren und exportieren

Mit den Datenbank- und Cloud Storage for Firebase-Emulatoren können Sie Daten aus einer laufenden Emulatorinstanz exportieren. Definieren Sie einen Basisdatensatz zur Verwendung in Ihren Unit-Tests oder Continuous-Integration-Workflows und exportieren Sie ihn dann zur gemeinsamen Nutzung im Team.

firebase emulators:export ./dir

Importieren Sie in Tests beim Start des Emulators die Basisdaten.

firebase emulators:start --import=./dir

Sie können den Emulator anweisen, Daten beim Herunterfahren zu exportieren, indem Sie entweder einen Exportpfad angeben oder einfach den an das Flag --import übergebenen Pfad verwenden.

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

Diese Datenimport- und -exportoptionen funktionieren auch mit dem Befehl firebase emulators:exec . Weitere Informationen finden Sie in der Emulator-Befehlsreferenz .

Visualisieren Sie die Aktivität „Sicherheitsregeln“.

Beim Durcharbeiten von Prototypen- und Testschleifen können Sie Visualisierungstools und Berichte verwenden, die von der Local Emulator Suite bereitgestellt werden.

Visualisieren Sie Regelauswertungen

Wenn Sie Ihrem Prototyp Sicherheitsregeln hinzufügen, können Sie diese mit den Tools der Local Emulator Suite debuggen.

Nachdem Sie eine Reihe von Tests ausgeführt haben, können Sie auf Testabdeckungsberichte zugreifen, die zeigen, wie jede Ihrer Regeln bewertet wurde. Um die Berichte zu erhalten, fragen Sie einen verfügbar gemachten Endpunkt auf dem Emulator ab, während dieser ausgeführt wird. Für eine browserfreundliche Version verwenden Sie die folgende URL:

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

Dadurch werden Ihre Regeln in Ausdrücke und Unterausdrücke unterteilt, über die Sie mit der Maus fahren können, um weitere Informationen zu erhalten, einschließlich der Anzahl der Ausführungen und der zurückgegebenen Werte. Für die JSON-Rohversion dieser Daten fügen Sie die folgende URL in Ihre Abfrage ein:

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

Was als nächstes?