Ir a la consola

Emulador de Firebase Realtime Database

El emulador de Realtime Database está diseñado para facilitar la escritura de pruebas de unidades que verifiquen el comportamiento de las reglas de seguridad de la base de datos.

En principio, es posible que la aplicación se ejecute en el emulador local y no en una base de datos de producción; sin embargo, te encontrarás con algunos problemas. Concretamente, la integración con Firebase Auth no funciona. Estamos trabajando en una solución; sin embargo, te animamos a escribir unas cuantas pruebas para asegurarte de que las reglas de seguridad funcionan adecuadamente.

Cuando se inicie el emulador, la base de datos se "bloqueará" desde una perspectiva de seguridad (".read" y ".write" son falsos). Antes de escribir, tendrás que configurar las reglas de seguridad. Para configurarlas directamente desde un marco de trabajo de prueba de unidades, usa el módulo del SDK de prueba, consulta los detalles a continuación.

Como siempre, apreciamos los comentarios. Danos tu opinión.

Diferencias entre el emulador y la producción

  1. No es necesario crear una instancia de base de datos de manera explícita. El emulador creará automáticamente cualquier instancia de base de datos a la que se acceda.
  2. Cada base de datos nueva se inicia con reglas cerradas, por lo que los usuarios que no sean administradores no podrán realizar operaciones de lectura ni escritura.
  3. Se aplican los límites y cuotas del plan Spark a todas las bases de datos emuladas (en particular, esto limita cada instancia a 100 conexiones simultáneas).
  4. Cualquier base de datos aceptará la string "owner" como token de autorización del administrador.
    1. Si quieres usar la API de REST como un administrador, incluye el encabezado
      Authorization: Bearer owner.
    2. Puedes usarlo para configurar reglas con curl. Si las reglas están en un archivo database.rules.json, esto debería funcionar:
      curl -X PUT -H 'Authorization: Bearer owner' --data @database.rules.json http://localhost:9000/.settings/rules.json?ns=<name>
  5. El emulador de la base de datos no tiene interacciones operativas con otros productos de Firebase. Particularmente, el flujo de autorización normal de Firebase no funcionará. En su lugar, proporcionamos el método initializeTestApp() en el módulo de prueba, que incluye un campo auth. El controlador de Firebase creado con este método se comportará como si se hubiese autenticado correctamente como cualquier entidad proporcionada. Si pasas null, se comportará como un usuario no autenticado (por ejemplo, las reglas auth != null fallarán).

Instala el emulador

Para instalar el emulador de Realtime Database, usa la Firebase CLI y sigue estos pasos.

  1. Para instalar el emulador de Realtime Database, usa el comando firebase setup:emulators:database.
  2. Inicia el emulador con el siguiente comando. El emulador se ejecuta durante todas tus pruebas. firebase serve --only database Ten en cuenta que el emulador de Realtime Database requiere Java 8 o versiones posteriores.

Interactúa con el emulador

Se puede acceder a una instancia normal de Firebase Realtime Database en un subdominio firebaseio.com. Puedes acceder a la API de REST de la siguiente manera:

https://<database_name>.firebaseio.com/path/to/my/data.json

El emulador se ejecuta de manera local y está disponible en localhost:9000 Para interactuar con una instancia de base de datos específica, tendrás que usar un parámetro de búsqueda a fin de especificar el nombre de la base de datos.

http://localhost:9000/path/to/my/data.json?ns=<database_name>

Proporcionamos el módulo @firebase/testing para facilitar la interacción con el emulador a través del SDK de Firebase. El módulo @firebase/testing te permite interactuar con una versión de ejecución local del emulador de Realtime Database. Si recibes errores ECONNREFUSED o tiempos de espera, vuelve a verificar que el emulador se esté ejecutando.

Recomendamos usar una versión reciente de Node.js para que puedas usar la notación async/await. Casi todo comportamiento que quieras probar involucra funciones asíncronas. El módulo de pruebas está diseñado para funcionar con un código basado en promesas.

El módulo expone los siguientes métodos:

initializeTestApp({ databaseName: , auth: }) => FirebaseApp

Úsalo para crear una app autenticada como un usuario específico que puedes usar durante las pruebas.

Muestra una app inicializada de Firebase correspondiente al nombre de la base de datos y a la variable de autenticación anulada que se especificó en las opciones. Ten en cuenta que esto NO usa la URL de la base de datos, ya que no se ejecuta en un servidor remoto.

firebase.initializeTestApp({
  databaseName: "my-database",
  auth: { uid: "alice" }
});

initializeAdminApp({ databaseName: }) => FirebaseApp

Úsalo a fin de crear una app autenticada como un administrador para configurar el estado de las pruebas.

Muestra una app de administración inicializada de Firebase correspondiente al nombre de la base de datos especificado en las opciones. Esta app ignora las reglas de seguridad al momento de leer o escribir en la base de datos.

firebase.initializeAdminApp({ databaseName: "my-database" });

loadDatabaseRules({ databaseName: , rules: }) => Promise

Úsalo para configurar las reglas de tu base de datos.

Envía reglas a la base de datos que se ejecuta de manera local. Toma un objeto de opciones que indique tu “databaseName” y tus “rules” como strings.

firebase
      .loadDatabaseRules({
        databaseName: "my-database",
        rules: "{'rules': {'.read': false, '.write': false}}"
      });

apps() => [FirebaseApp]

Muestra las apps de administración y prueba inicializadas.

Úsalo para limpiar las apps durante las pruebas, o cuando finalicen, (ten en cuenta que las apps inicializadas con agentes de escucha activos evitan la salida de JavaScript):

 Promise.all(firebase.apps().map(app => app.delete()))

assertFails(pr: Promise) => Promise

Muestra una promesa que es rechazada si se logra realizar la entrada y que tiene éxito si la entrada es rechazada.

Úsalo para declarar que una base de datos no puede leer o escribir:

firebase.assertFails(app.database().ref("secret").once("value"));

assertSucceeds(pr: Promise) => Promise

Muestra una promesa que tiene éxito si se logra realizar la entrada y que se rechaza si la entrada es rechazada.

Úsalo para declarar que una base de datos puede leer o escribir:

firebase.assertSucceeds(app.database().ref("public").once("value"));

Genera informes de prueba

Luego de ejecutar un conjunto de pruebas, puedes acceder a los informes de cobertura de pruebas que muestran cómo se evaluaron las reglas de seguridad. Para obtenerlos, consulta un extremo expuesto en el emulador mientras se ejecuta. Usa la siguiente URL para una versión compatible con el navegador:

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

Esto divide tus reglas en expresiones y subexpresiones sobre las que puedes desplazar el mouse para obtener más información, como la cantidad de ejecuciones y los valores mostrados. Si quieres acceder a la versión JSON sin procesar de los datos, incluye la siguiente URL en la consulta:

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

Guía de inicio rápido

Si quieres probar un ejemplo muy sencillo, sigue los pasos de la guía de inicio rápido de JavaScript.