Zbuduj testy jednostkowe

Emulatory Firebase ułatwiają pełną weryfikację działania aplikacji i weryfikację konfiguracji reguł zabezpieczeń Firebase. Użyj emulatorów Firebase, aby uruchamiać i automatyzować testy jednostkowe w środowisku lokalnym. Metody opisane w tym dokumencie powinny pomóc w tworzeniu i automatyzacji testów jednostkowych aplikacji, które weryfikują Twoje reguły.

Jeśli jeszcze nie masz, skonfigurować Firebase emulatory .

Zanim uruchomisz emulator

Zanim zaczniesz korzystać z emulatora, pamiętaj o następujących kwestiach:

  • Emulator będzie początkowo załadować zasady określone w firestore.rules lub polu „storage.rules” swojego firebase.json pliku. Jeśli plik nie istnieje, a nie korzystać z loadFirestoreRules lub metodę „loadStorageRules” jak opisano poniżej, traktuje emulatora wszystkich projektów, jak mając otwarte zasad.
  • Podczas gdy większość Firebase SDK praca z emulatorów bezpośrednio, tylko @firebase/rules-unit-testing obsługuje biblioteki szyderczy auth w przepisach bezpieczeństwa, dzięki czemu testy jednostkowe znacznie łatwiejsze. Ponadto biblioteka obsługuje kilka funkcji specyficznych dla emulatora, takich jak czyszczenie wszystkich danych, które wymieniono poniżej.
  • Emulatory będą również akceptować produkcyjne tokeny uwierzytelniania Firebase dostarczane za pośrednictwem pakietów Client SDK i odpowiednio oceniać reguły, co pozwala na połączenie aplikacji bezpośrednio z emulatorami w ramach testów integracyjnych i ręcznych.

Różnice między emulatorami baz danych a produkcją

  • Nie musisz jawnie tworzyć instancji bazy danych. Emulator automatycznie utworzy każdą instancję bazy danych, do której uzyskano dostęp.
  • Każda nowa baza danych jest uruchamiana z zamkniętymi regułami, więc użytkownicy niebędący administratorami nie będą mogli czytać ani pisać.
  • Każda baza danych emulowane stosuje planu Spark limity i kwoty (przede wszystkim ogranicza to każdy instancji do 100 jednoczesnych połączeń).
  • Wszelkie bazie akceptuje ciąg "owner" jako auth tokenu administratora.
  • Emulatory nie współpracują obecnie z innymi produktami Firebase. Warto zauważyć, że normalny przepływ Uwierzytelniania Firebase nie działa. Zamiast tego można użyć initializeTestApp() metoda na rules-unit-testing biblioteki, która odbywa się auth pole. Obiekt Firebase utworzony przy użyciu tej metody zachowuje się tak, jakby został pomyślnie uwierzytelniony jako dowolna podana przez Ciebie jednostka. Jeśli przechodzą w null , będzie zachowywać się jak niezidentyfikowany użytkownik ( auth != null reguły nie powiedzie się, na przykład).

Uruchom lokalne testy

Użyj @firebase/rules-unit-testing modułu do interakcji z emulatorze działa lokalnie. Jeśli masz limity czasu lub ECONNREFUSED błędy, sprawdź, że emulator jest faktycznie działa.

Zdecydowanie zalecamy użycie najnowszej wersji node.js więc można użyć async/await notacja. Prawie wszystkie zachowania, które możesz chcieć przetestować, obejmują funkcje asynchroniczne, a moduł testowania został zaprojektowany do pracy z kodem opartym na obietnicy.

Interakcja z emulatorem bazy danych czasu rzeczywistego

Spektakl Firebase Realtime instancja bazy danych jest dostępny w subdomenie firebaseio.com , można uzyskać dostęp do API REST tak:

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

Emulator działa lokalnie i jest dostępny na localhost:9000 . Do interakcji z instancją konkretnej bazy danych, będziesz musiał użyć ns parametr zapytania, aby określić nazwę bazy danych.

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

Testuj metody SDK

Wybierz produkt, aby zobaczyć metody używane przez pakiet Firebase Test SDK do łączenia się z emulatorem.

Cloud Firestore

Cloud Firestore

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

Ta metoda zwraca zainicjowaną aplikację Firebase odpowiadającą identyfikatorowi projektu i zmiennej uwierzytelniania określonej w opcjach. Użyj tego, aby utworzyć aplikację uwierzytelnioną jako określony użytkownik do użycia w testach.

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

initializeAdminApp({ projectId: string }) => FirebaseApp

Ta metoda zwraca zainicjowaną administracyjną aplikację Firebase. Ta aplikacja omija reguły bezpieczeństwa podczas wykonywania odczytów i zapisów. Użyj tego, aby utworzyć aplikację uwierzytelnioną jako administrator, aby ustawić stan dla testów.

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

apps() => [FirebaseApp] Metoda ta zwraca wszystkie aktualnie inicjowane testowe i administracja aplikacji. Użyj tego, aby wyczyścić aplikacje między testami lub po nich.

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

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

Ta metoda wysyła reguły do ​​lokalnie działającej bazy danych. Pobiera obiekt, który określa reguły jako ciąg. Użyj tej metody, aby ustawić reguły bazy danych.

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

assertFails(pr: Promise) => Promise

Ta metoda zwraca obietnicę, która jest odrzucana, jeśli dane wejściowe się powiedzie lub które powiedzie się, jeśli dane wejściowe zostaną odrzucone. Użyj tego, aby potwierdzić, jeśli odczyt lub zapis bazy danych nie powiedzie się.

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

assertSucceeds(pr: Promise) => Promise

Ta metoda zwraca obietnicę, która się powiedzie, jeśli dane wejściowe się powiedzie i zostaną odrzucone, jeśli dane wejściowe zostaną odrzucone. Użyj tego, aby potwierdzić, czy odczyt lub zapis bazy danych powiedzie się.

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

clearFirestoreData({ projectId: string }) => Promise

Ta metoda usuwa wszystkie dane powiązane z konkretnym projektem w lokalnie działającej instancji Firestore. Użyj tej metody do czyszczenia po testach.

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

Baza danych czasu rzeczywistego

Baza danych czasu rzeczywistego

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

Użyj tego, aby utworzyć aplikację uwierzytelnioną jako określony użytkownik do użycia w testach.

Zwraca zainicjowaną aplikację Firebase odpowiadającą nazwie bazy danych i zastąpieniu zmiennej uwierzytelniania określonej w opcjach.

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

initializeAdminApp({ databaseName: string }) => FirebaseApp

Użyj tego, aby utworzyć aplikację uwierzytelnioną jako administrator w celu skonfigurowania stanu dla testów.

Zwraca zainicjowaną aplikację administratora Firebase odpowiadającą nazwie bazy danych określonej w opcjach. Ta aplikacja omija reguły bezpieczeństwa podczas odczytu i zapisu do bazy danych.

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

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

Użyj tego, aby ustawić reguły swojej bazy danych.

Wysyła reguły do ​​lokalnie działającej bazy danych. Pobiera obiekt opcji, który określa twoją "databaseName" i twoje "reguły" jako ciągi.

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

apps() => [FirebaseApp]

Zwraca wszystkie aktualnie zainicjowane aplikacje testowe i administracyjne.

Użyj tego, aby wyczyścić aplikacje między testami lub po nich (zwróć uwagę, że zainicjowane aplikacje z aktywnymi detektorami zapobiegają zamykaniu JavaScript):

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

assertFails(pr: Promise) => Promise

Zwraca obietnicę, która jest odrzucana, jeśli dane wejściowe się powiedzie i powiedzie się, jeśli dane wejściowe zostaną odrzucone.

Użyj tego, aby potwierdzić, że odczyt lub zapis bazy danych nie powiedzie się:

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

assertSucceeds(pr: Promise) => Promise

Zwraca obietnicę, która się powiedzie, jeśli dane wejściowe się powiedzie i zostaną odrzucone, jeśli dane wejściowe zostaną odrzucone.

Użyj tego, aby potwierdzić, że odczyt lub zapis bazy danych się powiódł:

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

Magazyn w chmurze

Magazyn w chmurze

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

Użyj tego, aby utworzyć aplikację uwierzytelnioną jako określony użytkownik do użycia w testach.

Zwraca zainicjowaną aplikację Firebase odpowiadającą nazwie zasobnika na dane i zastąpieniu zmiennej uwierzytelniania określonej w opcjach.

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

initializeAdminApp({ storageBucket: string }) => FirebaseApp

Użyj tego, aby utworzyć aplikację uwierzytelnioną jako administrator w celu skonfigurowania stanu dla testów.

Zwraca zainicjowaną aplikację Firebase administratora odpowiadającą nazwie zasobnika na dane określonej w opcjach. Ta aplikacja omija reguły bezpieczeństwa podczas czytania i zapisywania w zasobniku.

firebase.initializeAdminApp({ storageBucket: "my-bucket" });

loadStorageRules({ storageBucket: string, rules: Object }) => Promise

Użyj tego, aby ustawić reguły zasobnika na dane.

Wysyła reguły do ​​lokalnie zarządzanych zasobników pamięci. Pobiera obiekt opcji, który określa „storageBucket” i „reguły” jako ciągi.

firebase
      .loadStorageRules({
        storageBucket: "my-bucket",
        rules: fs.readFileSync("/path/to/storage.rules", "utf8")
      });

apps() => [FirebaseApp]

Zwraca wszystkie aktualnie zainicjowane aplikacje testowe i administracyjne.

Użyj tego, aby wyczyścić aplikacje między testami lub po nich (zwróć uwagę, że zainicjowane aplikacje z aktywnymi detektorami zapobiegają zamykaniu JavaScript):

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

assertFails(pr: Promise) => Promise

Zwraca obietnicę, która jest odrzucana, jeśli dane wejściowe się powiedzie i powiedzie się, jeśli dane wejściowe zostaną odrzucone.

Użyj tego, aby potwierdzić, że odczyt lub zapis zasobnika pamięci nie powiedzie się:

firebase.assertFails(app.storage().ref("letters/private.doc").getMetadata());

assertSucceeds(pr: Promise) => Promise

Zwraca obietnicę, która się powiedzie, jeśli dane wejściowe się powiedzie i zostaną odrzucone, jeśli dane wejściowe zostaną odrzucone.

Użyj tego, aby potwierdzić, że odczyt lub zapis zasobnika pamięci powiodło się:

firebase.assertFails(app.storage().ref("images/cat.png").getMetadata());