Ir para o console

Criar testes de unidade

Com os emuladores do Firebase, é fácil validar completamente o comportamento do seu aplicativo e verificar as configurações das regras de segurança do Firebase. Use os emuladores para executar e automatizar testes de unidade em um ambiente local. Os métodos descritos neste documento ajudarão você a criar e automatizar testes de unidade para seu aplicativo que validem suas regras.

Configure os emuladores do Firebase caso ainda não tenha feito isso.

Antes de executar o emulador

Considere as seguintes informações antes de começar a usar o emulador:

  • O único SDK compatível atualmente com o emulador é o SDK para Node.js. Fornecemos o módulo @firebase/testing para facilitar a interação com o emulador.
  • O emulador é compatível com uma sinalização --rules opcional da CLI. Ele espera receber o nome de um arquivo local que contém as regras e as aplica a todos os projetos. Se você não fornecer o caminho do arquivo local nem usar os métodos loadFirestoreRules ou loadDatabaseRules, o emulador tratará todos os projetos como tendo regras abertas.

Diferenças entre o emulador e a produção

  • Você não precisa criar uma instância de banco de dados de maneira explícita. O emulador criará automaticamente qualquer instância como essa que for acessada.
  • Cada novo banco de dados é iniciado com regras fechadas. Dessa forma, usuários que não forem administradores não terão permissão para realizar operações de leitura ou gravação.
  • Cada banco de dados emulado aplica os limites e as cotas do plano Spark. É importante ressaltar que isso limita cada instância a 100 conexões simultâneas.
  • Qualquer banco de dados aceitará a string "owner" como um token de autenticação de administrador.
  • No momento, os emuladores não têm interações de trabalho com outros produtos do Firebase. Além disso, é importante ressaltar que o Firebase Authentication não funcionará no fluxo normal. Em vez disso, será possível usar o método initializeTestApp() no módulo de teste, que ocupa um campo de auth. O objeto do Firebase criado a partir desse método se comportará como se tivesse sido autenticado com sucesso como qualquer entidade que você fornecer. Caso null seja transmitido, ele se comportará como um usuário não autenticado. Por exemplo, as regras auth != null apresentarão falha.

Executar testes locais

Use o módulo @firebase/testing para interagir com o emulador executado localmente. Se você tiver tempos limites ou erros ECONNREFUSED, verifique novamente se o emulador está em execução.

É altamente recomendável o uso de uma versão recente do Node.js para utilizar a notação async/await. Quase todos os comportamentos que podem ser testados envolvem funções assíncronas, e o módulo de teste é projetado para funcionar com código baseado em promessas.

Métodos do emulador

Selecione um produto para ver os métodos que o módulo do emulador expõe.

Cloud Firestore

Cloud Firestore

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

Esse método retorna um aplicativo do Firebase inicializado que corresponde ao código do projeto e à variável de autenticação especificados nas opções. Use esse método e crie um aplicativo autenticado como um usuário específico para ser utilizado em testes.

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

initializeAdminApp({ projectId: string }) => FirebaseApp

Esse método retorna um aplicativo de administrador inicializado do Firebase. Esse aplicativo ignora as regras de segurança ao executar leituras e gravações. Use-o para criar um aplicativo autenticado como administrador e definir o estado para os testes.

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

apps() => [FirebaseApp] Esse método retorna todos os aplicativos de teste e de administração inicializados no momento. Ele pode ser usado para limpar aplicativos durante e depois dos testes.

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

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

Esse método envia regras para um banco de dados em execução localmente. Ele utiliza um objeto que especifica as regras como uma string. Use-o para definir as regras do seu banco de dados.

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

assertFails(pr: Promise) => Promise

Esse método retorna uma promessa que será recusada se a entrada for concluída e que será concluída se a entrada for recusada. Use-o para informar se ocorreu uma falha na leitura ou gravação no banco de dados.

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

assertSucceeds(pr: Promise) => Promise

Esse método retorna uma promessa que será concluída se a entrada for concluída e que será recusada se a entrada for recusada. Use-o para informar se uma leitura ou gravação no banco de dados foi concluída.

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

clearFirestoreData({ projectId: string }) => Promise

Esse método limpa todos os dados associados a um projeto específico na instância do Firestore que estão em execução localmente. Use-o para limpar os dados após os testes.

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

Realtime Database

Realtime Database

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

Use esse método para criar um aplicativo autenticado como um usuário específico a ser utilizado em testes.

Ele retorna um aplicativo do Firebase inicializado correspondente ao nome do banco de dados e à modificação da variável de autenticação especificada nas opções.

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

initializeAdminApp({ databaseName: string }) => FirebaseApp

Use esse método para criar um aplicativo autenticado como administrador e configurar o estado para os testes.

Ele retorna um aplicativo de administrador do Firebase inicializado correspondente ao nome do banco de dados especificado nas opções. Esse aplicativo ignora as regras de segurança durante a leitura e a gravação no banco de dados.

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

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

Use esse método para definir as regras do seu banco de dados.

Ele envia regras para um banco de dados executado localmente. Além disso, ele usa um objeto de opções que especifica "databaseName" e "rules" como strings.

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

apps() => [FirebaseApp]

Esse método retorna todos os aplicativos de teste e de administrador inicializados no momento.

Use-o para limpar aplicativos durante e depois dos testes. Observação: os aplicativos inicializados com listeners ativos impedem o JavaScript de finalizar a execução:

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

assertFails(pr: Promise) => Promise

Esse método retorna uma promessa que será recusada se a entrada for concluída e que será concluída se a entrada for recusada.

Use-o para informar que ocorreu uma falha na leitura ou na gravação no banco de dados:

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

assertSucceeds(pr: Promise) => Promise

Esse método retorna uma promessa que será concluída se a entrada for concluída e será recusada se a entrada for recusada.

Use-o para informar que uma leitura ou gravação no banco de dados foi concluída:

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