Compila pruebas de unidades

Los emuladores de Firebase facilitan que puedas validar por completo el comportamiento de tu app y que puedas verificar la configuración de tus reglas de seguridad de Firebase. Usa los emuladores de Firebase para ejecutar y automatizar las pruebas de unidades en un entorno local. Los métodos descritos en este documento te pueden ayudar a medida que compilas y automatizas las pruebas de unidades en la app que valida tus reglas.

Si aún no lo has hecho, configura los emuladores de Firebase.

Antes de que ejecutes el emulador

Antes de comenzar a usar el emulador, ten en cuenta lo siguiente:

  • El único SDK que actualmente admite el emulador es el SDK de Node.js. Proporcionamos el módulo @firebase/testing para facilitar la interacción con el emulador.
  • El emulador admite una marca opcional de la CLI --rules. Esta espera el nombre de un archivo local con tus reglas de seguridad y las aplica a todos los proyectos. Si no proporcionas la ruta de un archivo local o usas los métodos loadFirestoreRulesloadDatabaseRules, el emulador trata todos los proyectos como si tuvieran reglas abiertas.

Diferencias entre el emulador y la producción

  • 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.
  • 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.
  • 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).
  • Cualquier base de datos aceptará la string "owner" como token de autorización del administrador.
  • Actualmente, los emuladores no tienen interacciones de trabajo con otros productos de Firebase. Particularmente, el flujo normal de Firebase Authentication no funcionará. En su lugar, puedes usar el método initializeTestApp() en el módulo de prueba, que toma un campo auth. El objeto de Firebase creado con este método se comportará como si se hubiera autenticado correctamente como cualquier entidad proporcionada. Si pasas null, se comportará como un usuario no autenticado (por ejemplo, las reglas auth != null fallarán).

Ejecuta pruebas locales

Usa el módulo @firebase/testing para interactuar con el emulador que se ejecuta de manera local. Si recibes errores ECONNREFUSED o tiempos de espera, vuelve a verificar que se esté ejecutando el emulador.

Recomendamos usar una versión reciente de Node.js, de modo que puedas utilizar 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.

Métodos del emulador

Selecciona un producto para ver los métodos que expone el módulo del emulador.

Cloud Firestore

Cloud Firestore

initializeTestApp({ projectId: string, auth: Object }) => FirebaseApp

Este método muestra una app de Firebase inicializada correspondiente al ID del proyecto y la variable de auth especificada en las opciones. Úsalo para crear una app autenticada como un usuario específico que puedes usar durante las pruebas.

firebase.initializeTestApp({
  projectId: "my-test-project",
  auth: { uid: "alice", email: "alice@example.com" }
});

initializeAdminApp({ projectId: string }) => FirebaseApp

Este método muestra una app de administración de Firebase inicializada. Esta app elude las reglas de seguridad cuando realiza operaciones de lectura o escritura. Usa el método a fin de crear una app autenticada como un administrador para configurar el estado de las pruebas.

firebase.initializeAdminApp({ projectId: "my-test-project" });
    

apps() => [FirebaseApp] Este método muestra todas las apps de administración y pruebas inicializadas actualmente. Úsalo para limpiar las apps entre pruebas o después de ellas.

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

loadFirestoreRules({ projectId: string, rules: Object }) => Promise

Este método envía reglas a una base de datos que se ejecuta localmente. Requiere de un objeto que especifique las reglas como una string. Usa este método para configurar las reglas de tu base de datos.

firebase.loadFirestoreRules({
  projectId: "my-test-project",
  rules: fs.readFileSync("/path/to/firestore.rules", "utf8")
});
    

assertFails(pr: Promise) => Promise

Este método muestra una promesa que es rechazada si se logra realizar la entrada o que tiene éxito si la entrada es rechazada. Úsalo para confirmar que una base de datos no puede realizar leer o escribir:

firebase.assertFails(app.firestore().collection("private").doc("super-secret-document").get());
    

assertSucceeds(pr: Promise) => Promise

Este método muestra una promesa que tiene éxito si se logra realizar la entrada y que es rechazada si la entrada es rechazada. Úsalo para confirmar si una base de datos puede leer o escribir:

firebase.assertSucceeds(app.firestore().collection("public").doc("test-document").get());
    

clearFirestoreData({ projectId: string }) => Promise

Este método borra todos los datos asociados a un proyecto determinado de la instancia de Firestore que se ejecuta de manera local. Usa este método para realizar la limpieza después de las pruebas.

firebase.clearFirestoreData({
  projectId: "my-test-project"
});
   

Realtime Database

Realtime Database

initializeTestApp({ databaseName: string, auth: Object }) => 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.

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

initializeAdminApp({ databaseName: string }) => 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: string, rules: Object }) => 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"));