將應用程式連線至即時資料庫模擬器

將應用程式連線至 Realtime Database 模擬器之前,請確定 您瞭解整體 Firebase Local Emulator Suite 工作流程。 而且您需要安裝及設定 Local Emulator Suite 並查看其 CLI 指令

選擇 Firebase 專案

Firebase Local Emulator Suite 在單一 Firebase 專案中模擬產品。

如要選取要使用的專案,請先在 CLI 執行下列指令,再啟動模擬器 firebase use。您也可以 對每個模擬器使用 --project 標記 指令

Local Emulator Suite 支援模擬「實際」的 Firebase 專案和 demo 專案。

專案類型 功能 與模擬器搭配使用
真實

真正的 Firebase 專案是您建立及設定的專案 (很有可能 透過 Firebase 控制台進行)。

真實專案具備即時資源,例如資料庫執行個體、儲存空間 您為此 Firebase 設定的值區、函式或任何其他資源 專案。

使用實際的 Firebase 專案時 或所有支援的產品

如有任何產品並非由您模擬,應用程式和程式碼就會 會與 live 資源 (資料庫執行個體、儲存空間) 互動 值區、函式等)。

示範

示範 Firebase 專案沒有實際的 Firebase 設定, 沒有即時資源這類專案通常透過程式碼研究室或 其他教學課程

示範專案的專案 ID 含有前置字串 demo-

使用示範 Firebase 專案時,您的應用程式和程式碼會與 僅適用於模擬器。如果應用程式嘗試與資源互動 未執行模擬器時,該程式碼就會失敗。

建議您盡可能使用示範專案。Meet 具備以下優點:

  • 設定更簡單,因為您無須建立 Firebase 專案
  • 提升安全性,因為程式碼意外叫用非模擬 (實際工作環境) 資源,則任何資料都無法變更、用量和計費
  • 更完善的離線支援功能,因為不必上網也可以 下載 SDK 設定。
,瞭解如何調查及移除這項存取權。

檢測應用程式,以便與模擬器通訊

Android、Apple 平台和 Web SDK

設定應用程式內設定或測試類別,以便與 Realtime Database,如下所示。

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

如要測試由即時資料庫事件觸發的 Cloud Functions,不需要額外設定 新增應用程式當即時資料庫和 Cloud Functions 模擬器 兩者都能自動搭配運作

Admin SDK

Firebase Admin SDK 會在下列情況自動連線至 Realtime Database 模擬器 FIREBASE_DATABASE_EMULATOR_HOST 環境變數已設定:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

如果程式碼是在 Cloud Functions 模擬器中執行,則專案 ID 且其他設定會在呼叫 initializeApp 時自動設定。

如果您希望 Admin SDK 程式碼連線至在以下位置執行的共用模擬器, 如果是另一個環境,您需要指定使用 Firebase CLI 設定的相同專案 ID。 您可以將專案 ID 直接傳遞至 initializeApp,也可以設定 GCLOUD_PROJECT 環境變數。

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

清除測試之間的資料庫

如要在活動之間清除 Realtime Database,您可以清除資料庫參考資料。您可以將這個方法做為直接關閉模擬器程序的替代方法。

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

一般來說,程式碼應利用平台的非同步事件處理功能,等待確認清除完畢或失敗。

完成上述步驟後,您就可以將測試排序並觸發函式,不必擔心舊資料會在執行期間清除,且使用新的基準測試設定。

匯入及匯出資料

資料庫和 Cloud Storage for Firebase 模擬器可讓您匯出資料 從執行中的模擬器執行個體複製資料定義要用於 單元測試或持續整合工作流程,然後匯出以供共用 團隊合作的成果

firebase emulators:export ./dir

在測試中,在模擬器啟動時匯入基準資料。

firebase emulators:start --import=./dir

您可以指示模擬器在關機時匯出資料,方法是指定 或直接使用傳遞至 --import 的路徑 旗標。

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

這些資料匯入和匯出選項 firebase emulators:exec 指令。詳情請參閱 模擬器指令參考資料

以圖表呈現安全性規則活動

當您在研究原型和測試迴圈時,可以使用視覺化工具 以及 Local Emulator Suite 提供的報告

視覺化呈現規則評估

將安全性規則加入原型後,您就能使用 Local Emulator Suite 工具。

執行一系列的測試後,您可以存取 每項規則的評估方式如要取得報表,您可以查詢已公開 端點。針對適用瀏覽器的版本 使用下列網址:

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

這會將規則分為可兌換的運算式和子運算式 將滑鼠遊標懸停在上方即可瞭解詳情,包括執行作業數量和值 。對於這項資料的原始 JSON 版本,請在 :

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

接下來呢?