获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

将您的应用程序连接到实时数据库模拟器

在将您的应用连接到实时数据库模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流程,并安装和配置Local Emulator Suite 并查看其CLI 命令

选择一个 Firebase 项目

Firebase 本地模拟器套件模拟单个 Firebase 项目的产品。

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

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

项目类型特征与模拟器一起使用
真实的

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

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

在处理真正的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

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

演示

演示 Firebase 项目没有真正的Firebase 配置,也没有实时资源。这些项目通常通过代码实验室或其他教程访问。

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

使用演示 Firebase 项目时,您的应用和代码与模拟器交互。如果您的应用程序尝试与未运行模拟器的资源进行交互,则该代码将失败。

我们建议您尽可能使用演示项目。好处包括:

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

检测您的应用程序以与模拟器对话

Android、Apple 平台和 Web SDK

设置您的应用内配置或测试类以与实时数据库交互,如下所示。

安卓
        // 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);
迅速
    // In almost all cases the ns (namespace) is your project ID.
let db = Database.database(url:"http://localhost:9000?ns=YOUR_DATABASE_NAMESPACE")

Web version 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 version 8

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

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

管理 SDK

设置FIREBASE_DATABASE_EMULATOR_HOST环境变量后,Firebase Admin SDK 会自动连接到实时数据库模拟器:

export FIREBASE_DATABASE_EMULATOR_HOST="localhost:9000"

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

如果您希望您的 Admin SDK 代码连接到在另一个环境中运行的共享模拟器,则需要指定您使用 Firebase CLI 设置的相同项目 ID 。您可以将项目 ID 直接传递给initializeApp或设置GCLOUD_PROJECT环境变量。

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

在测试之间清除数据库

要在活动之间刷新实时数据库,您可以清除数据库引用。您可以使用此方法作为简单关闭模拟器进程的替代方法。

安卓
// With a DatabaseReference, write null to clear the database.
database.getReference().setValue(null);
迅速
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

Web version 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 version 8

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

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

实施了这样的步骤后,您可以对测试进行排序并触发您的函数,确信旧数据将在运行之间被清除,并且您正在使用新的基线测试配置。

导入和导出数据

Firebase 模拟器的数据库和 Cloud Storage 允许您从正在运行的模拟器实例中导出数据。定义要在单元测试或持续集成工作流中使用的基线数据集,然后将其导出以在团队之间共享。

firebase emulators:export ./dir

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

firebase emulators:start --import=./dir

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

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

这些数据导入和导出选项也适用于firebase emulators:exec命令。有关更多信息,请参阅模拟器命令参考

可视化安全规则活动

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

可视化规则评估

当您将安全规则添加到您的原型时,您可以使用本地仿真器套件工具对其进行调试。

运行一套测试后,您可以访问测试覆盖率报告,其中显示了如何评估您的每个规则。要获取报告,请在模拟器运行时查询其暴露的端点。对于浏览器友好的版本,请使用以下 URL:

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

这会将您的规则分解为表达式和子表达式,您可以将鼠标悬停以获取更多信息,包括执行次数和返回值。对于此数据的原始 JSON 版本,请在查询中包含以下 URL:

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

接下来是什么?