将应用连接到 Realtime Database 模拟器

在将您的应用连接到 Realtime Database 模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流,而且已安装和配置 Local Emulator Suite 并已查看其 CLI 命令

选择一个 Firebase 项目

Firebase Local Emulator Suite 可以模拟单个 Firebase 项目的产品。

如需选择要使用的项目,在启动模拟器之前,请在 CLI 中于工作目录中运行 firebase use。或者,您可以将 --project 标志传递给每个模拟器命令。

Local Emulator Suite 支持模拟实际 Firebase 项目和演示项目。

项目类型 特性 与模拟器结合使用
实际

实际的 Firebase 项目就是您创建和配置的项目(很可能是通过 Firebase 控制台)。

实际项目包含实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。

使用实际的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

对于您未模拟的任何产品,您的应用和代码都将与实时资源(数据库实例、存储桶、函数等)交互。

演示

演示 Firebase 项目没有实际 Firebase 配置,也没有实时资源。 这些项目通常可通过 Codelab 或其他教程访问。

演示项目的 ID 带有 demo- 前缀。

使用演示 Firebase 项目时,您的应用和代码仅与模拟器互动。如果您的应用尝试与您没有为其运行模拟器的资源进行交互,该代码将失败。

我们建议您尽可能使用演示项目。演示项目具有以下优势:

  • 设置更简单,因为您无需创建 Firebase 项目即可运行模拟器
  • 安全性更强,因为如果您的代码意外调用了非模拟(生产)资源,也不会发生数据更改、资源使用并产生费用
  • 提供更好的离线支持,因为无需访问互联网即可下载您的 SDK 配置。

对您的应用进行插桩处理以与模拟器通信

Android、Apple 平台和 Web SDK

按照以下步骤设置您的应用内配置或测试类,以便与 Realtime Database 进行交互。

Android
        // 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://localhost:9000?ns=YOUR_DATABASE_NAMESPACE")

Web 版本 9

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

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

Web 版本 8

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

使用模拟器测试由 Realtime Database 事件触发的 Cloud Functions 函数无需进行额外设置。当 Realtime Database 和 Cloud Functions 模拟器都在运行时,它们会自动协同工作。

Admin SDK

设置 FIREBASE_DATABASE_EMULATOR_HOST 环境变量后,Firebase Admin SDK 会自动连接到 Realtime Database 模拟器:

export FIREBASE_DATABASE_EMULATOR_HOST="localhost:9000"

如果您的代码在 Cloud Functions 模拟器中运行,则系统会在调用 initalizeApp 时自动设置您的项目 ID 和其他配置。

当从任何其他环境连接到 Realtime Database 模拟器时,您需要指定项目 ID。您可以直接将项目 ID 传递给 initializeApp 或设置 GCLOUD_PROJECT 环境变量。请注意,您不需要使用实际的 Firebase 项目 ID,Realtime Database 模拟器会接受任何项目 ID:

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

在多轮测试之间清空数据库

如需在多轮活动之间刷新 Realtime Database,您可以清除数据库引用。您可以使用此方法,作为简单地关停模拟器进程的替代方案。

Android
// 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 版本 9

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 版本 8

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

当然,您的代码应使用平台的异步事件处理功能等待关于刷新完成或失败的确认信息。

在完成类似的步骤后,您可以对测试进行排序并触发函数,并且确信旧数据在多轮运行之间会被清除,您使用的是全新的基准测试配置。

导入和导出数据

借助数据库和 Cloud Firestore 模拟器,您可以从正在运行的模拟器实例中导出数据。定义要在单元测试或持续集成工作流中使用的基准数据集,然后将其导出以供团队共享。

firebase emulators:export ./dir

在测试中,当模拟器启动时,导入基准数据。

firebase emulators:start --import=./dir

您可以指示模拟器在关停时导出数据,方法是指定导出路径,或者简单地使用传递给 --import 标志的路径。

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

这些数据导入和导出选项也适用于 firebase emulators:exec 命令。如需了解详情,请参阅模拟器命令参考文档

直观呈现安全规则活动

在完成原型和测试循环的过程中,您可以使用 Locasl Emulator Suite 提供的可视化工具和报告。

直观呈现规则评估

在向原型添加安全规则时,您可以使用 Local Emulator Suite 工具调试这些规则。

运行一系列测试后,您可以访问测试范围报告,报告中会显示每条规则的评估结果。如需获取这些报告,请在模拟器运行期间查询它的某个公开端点。如需适用于浏览器的版本,请使用以下网址:

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

此报告会将您的规则分解为表达式和子表达式,将鼠标悬停在相应表达式上即可了解更多信息,包括执行的次数和返回的值。如需这些数据的原始 JSON 版本,请在查询中包含以下网址:

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

后续步骤