Catch up on everything we announced at this year's Firebase Summit. Learn more

將您的應用連接到 Cloud Firestore 模擬器

您的應用程序連接到雲計算公司的FireStore仿真器之前,請確保你理解了全部火力地堡本地模擬器套房的工作流程,以及您安裝並配置本地仿真器套件和審查其CLI命令

選擇一個 Firebase 項目

Firebase 本地模擬器套件模擬單個 Firebase 項目的產品。

要選擇項目中使用,啟動模擬器前,在命令行運行firebase use在你的工作目錄。或者,您可以通過--project標誌給每個仿真命令。

當地仿真器套件支持實時火力地堡項目和示範項目的仿真。

項目類型特徵與模擬器一起使用
真實的

一個真正的 Firebase 項目是您創建和配置的(很可能通過 Firebase 控制台)。

真實項目具有實時資源,例如數據庫實例、存儲桶、函數或您為該 Firebase 項目設置的任何其他資源。

在處理真實的 Firebase 項目時,您可以為任何或所有受支持的產品運行模擬器。

因為你不模仿任何產品,您的應用程序和代碼將用資源(數據庫實例,存儲鬥,功能等)進行交互。

演示

一個演示火力地堡項目有沒有真正的火力地堡配置和沒有活的資源。這些項目通常通過代碼實驗室或其他教程訪問。

項目編號為示範項目有demo-前綴。

當演示火力地堡的項目,你的應用程序和用仿真器代碼交互工作。如果您的應用嘗試與模擬器未運行的資源進行交互,則該代碼將失敗。

我們建議您盡可能使用演示項目。好處包括:

  • 設置更簡單,因為您無需創建 Firebase 項目即可運行模擬器
  • 更強的安全性,因為如果您的代碼不小心調用了非模擬(生產)資源,則不會發生數據更改、使用和計費
  • 更好的離線支持,因為無需訪問互聯網即可下載您的 SDK 配置。

檢測您的應用程序以與模擬器對話

Android、Apple 平台和 Web SDK

設置您的應用內配置或測試類以與 Cloud Firestore 交互,如下所示。

安卓
        // 10.0.2.2 is the special IP address to connect to the 'localhost' of
        // the host computer from an Android emulator.
        FirebaseFirestore firestore = FirebaseFirestore.getInstance();
        firestore.useEmulator("10.0.2.2", 8080);

        FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
                .setPersistenceEnabled(false)
                .build();
        firestore.setFirestoreSettings(settings);
迅速
let settings = Firestore.firestore().settings
settings.host = "localhost:8080"
settings.isPersistenceEnabled = false 
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

網頁版 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, 'localhost', 8080);

網頁版 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("localhost", 8080);
}
網絡
// Initialize your Web app as described in the Get started for Web
// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("localhost", 8080);
}

無需額外的設置是需要測試雲功能通過公司的FireStore事件觸發使用模擬器。當 Firestore 和 Cloud Functions 模擬器同時運行時,它們會自動協同工作。

管理 SDK

當在火力地堡管理軟件開發工具包自動連接到雲公司的FireStore模擬器FIRESTORE_EMULATOR_HOST環境變量設置:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

如果你的代碼是雲功能中正在運行的仿真項目ID和其他配置將調用時,將自動設定initalizeApp

從任何其他環境連接到 Cloud Firestore 模擬器時,您需要指定項目 ID。你可以通過一個項目ID來initializeApp直接或設置GCLOUD_PROJECT環境變量。請注意,您不需要使用真實的 Firebase 項目 ID;雲公司的FireStore仿真器將接受任何項目的ID,只要它有一個有效的格式

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

在測試之間清除數據庫

生產 Firestore 沒有提供用於刷新數據庫的平台 SDK 方法,但 Firestore 模擬器為您提供了一個專門用於此目的的 REST 端點,可以從測試框架設置/拆卸步驟、測試類或外殼(例如與curl )測試將被斷開之前。您可以使用此方法作為簡單地關閉模擬器進程的替代方法。

在一個適當的方法中,執行HTTP DELETE操作,供給你的火力地堡專案編號,例如firestore-emulator-example ,以下端點:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

自然地,您的代碼應該等待 REST 確認刷新完成或失敗。

您可以從 shell 執行此操作:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

實施了這樣的步驟後,您可以對測試進行排序並觸發您的功能,因為舊數據將在運行之間被清除,並且您正在使用新的基線測試配置。

導入導出數據

數據庫和 Cloud Storage 模擬器允許您從正在運行的模擬器實例導出數據。定義一組基線數據以在您的單元測試或持續集成工作流中使用,然後將其導出以在團隊之間共享。

firebase emulators:export ./dir

在測試中,在模擬器啟動時,導入基線數據。

firebase emulators:start --import=./dir

您可以指示仿真器的出口數據在關機,要么指定導出路徑,或者乾脆利用傳遞到路徑--import標誌。

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

這些數據導入和導出選項與工作firebase emulators:exec命令為好。有關詳細信息,請參閱仿真器命令參考

可視化安全規則活動

在完成原型和測試循環時,您可以使用本地仿真器套件提供的可視化工具和報告。

使用請求監視器

Cloud Firestore 模擬器可讓您在 Emulator Suite UI 中可視化客戶端請求,包括 Firebase 安全規則的評估跟踪。

打開的FireStore>請求選項卡以查看每個請求的詳細評估序列。

Firestore 模擬器請求監視器顯示安全規則評估

可視化規則評估報告

當您向原型添加安全規則時,您可以使用本地模擬器套件調試工具對其進行調試。

運行一組測試後,您可以訪問測試覆蓋率報告,其中顯示瞭如何評估每個安全規則。

要獲取報告,請在模擬器運行時查詢模擬器上公開的端點。對於瀏覽器友好的版本,請使用以下 URL:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

這將您的規則分解為表達式和子表達式,您可以將鼠標懸停在其上以獲取更多信息,包括評估的數量和返回的值。對於此數據的原始 JSON 版本,請在查詢中包含以下 URL:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

此處,報告的 HTML 版本突出顯示了引發未定義和空值錯誤的評估:

Cloud Firestore 模擬器與生產環境有何不同

Cloud Firestore 模擬器嘗試忠實地複制生產服務的行為,但有一些明顯的限制。

交易

模擬器目前沒有實現生產中看到的所有事務行為。當您測試涉及多個並發寫入一個文檔的功能時,模擬器完成寫入請求的速度可能會很慢。在某些情況下,鎖定可能需要長達 30 秒才能釋放。如果需要,請考慮相應地調整測試超時。

索引

模擬器不會跟踪複合索引,而是會執行任何有效的查詢。確保針對真實的 Cloud Firestore 實例測試您的應用以確定您需要哪些索引。

限制

模擬器不會強制執行生產中強制執行的所有限制。例如,模擬器可能允許會被生產服務拒絕的事務過大。確保你熟悉記錄的限制和您設計您的應用程序,以主動避免它們。

接下來是什麼?