Buka konsol

Membuat tes unit

Firebase Emulator mempermudah untuk sepenuhnya memvalidasi perilaku aplikasi Anda dan memverifikasi konfigurasi Aturan Keamanan Firebase Anda. Gunakan Firebase Emulator untuk menjalankan dan mengotomatiskan pengujian unit di lingkungan lokal. Metode yang diuraikan pada dokumen ini akan membantu Anda dalam membuat dan mengotomatiskan pengujian unit untuk aplikasi Anda yang memvalidasi Aturan Anda.

Siapkan Firebase Emulator jika Anda belum melakukannya.

Sebelum menjalankan emulator

Sebelum Anda mulai menggunakan emulator, perhatikan hal-hal berikut:

  • Satu-satunya SDK yang saat ini mendukung emulator adalah Node.js SDK. Kami telah menyediakan modul @firebase/testing untuk mempermudah interaksi dengan emulator.
  • Emulator mendukung tanda CLI --rules opsional. Emulator mengharapkan nama file lokal yang berisi aturan Anda Firestore dan menerapkan aturan tersebut untuk semua project. Jika Anda tidak menyediakan path file lokal atau menggunakan metode loadFirestoreRules atau loadDatabaseRules, emulator akan menganggap semua project memiliki aturan terbuka.

Perbedaan antara emulator dan produksi

  • Anda tidak harus membuat instance database secara eksplisit. Emulator akan otomatis membuat instance database yang diakses.
  • Setiap database baru dimulai dengan aturan tertutup, sehingga pengguna selain admin tidak dapat melakukan pembacaan atau penulisan.
  • Setiap database yang telah teremulasi menerapkan batas dan kuota paket Spark (terutama, hal ini membatasi setiap instance untuk 100 koneksi serentak).
  • Setiap database akan menerima string "owner" sebagai token autentikasi admin.
  • Emulator saat ini tidak memiliki interaksi yang berfungsi dengan produk Firebase lainnya. Secara khusus, alur Firebase Authentication normal tidak akan berfungsi. Sebagai gantinya, Anda dapat menggunakan metode initializeTestApp() dalam modul pengujian, yang membutuhkan kolom auth. Objek Firebase yang dibuat menggunakan metode ini akan berperilaku seolah-olah telah berhasil diautentikasi sebagai entitas apa pun yang Anda berikan. Jika Anda meneruskan null, pengendali tersebut akan berperilaku sebagai pengguna tak terautentikasi (misalnya aturan auth != null akan gagal).

Menjalankan pengujian lokal

Gunakan modul @firebase/testing untuk berinteraksi dengan emulator yang berjalan secara lokal. Jika Anda menemukan error ECONNREFUSED atau waktu tunggu, periksa kembali apakah emulator sedang berjalan atau tidak.

Kami sangat menyarankan untuk menggunakan Node.js versi terbaru agar Anda dapat menggunakan notasi async/await. Hampir semua perilaku yang mungkin ingin Anda uji melibatkan fungsi asinkron, dan modul pengujian dirancang untuk digunakan dengan kode berbasis Promise.

Metode emulator

Pilih produk untuk melihat metode yang ditampakkan oleh modul emulator.

Cloud Firestore

Cloud Firestore

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

Metode ini menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan ID project dan variabel autentikasi yang ditentukan pada opsi. Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan pada pengujian.

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

initializeAdminApp({ projectId: string }) => FirebaseApp

Metode ini menampilkan aplikasi Firebase admin yang diinisialisasi. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan. Gunakan metode ini untuk membuat aplikasi y.ng diautentikasi sebagai admin guna menyiapkan status untuk pengujian.

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

apps() => [FirebaseApp] .Metode ini menampilkan semua aplikasi pengujian dan admin yang saat ini diinisialisasi. Gunakan ini untuk membersihkan aplikasi di antara pengujian atau setelah pengujian.

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

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

Metode ini mengirim aturan ke database yang berjalan secara lokal. Perlu objek yang menentukan aturan sebagai string. Gunakan metode ini untuk menetapkan aturan database Anda.

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

assertFails(pr: Promise) => Promise

Metode ini menampilkan promise yang ditolak jika input berhasil atau yang berhasil jika input ditolak. Gunakan metode ini untuk menegaskan jika pembacaan atau penulisan database gagal.

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

assertSucceeds(pr: Promise) => Promise

Metode ini menghasiilkan promise yang berhasil jika input berhasil dan ditolak jika input ditolak. Gunakan metode ini untuk menegaskan jika pembacaan atau penulisan database berhasil.

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

clearFirestoreData({ projectId: string }) => Promise

Metode ini menghapus semua data yang terkait dengan project tertentu pada instance Firestore yang dijalankan secara lokal. Gunakan metode ini untuk menghapus setelah pengujian.

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

Realtime Database

Realtime Database

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

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan pada pengujian.

Menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan nama database dan penggantian variabel autentikasi yang ditentukan pada pilihan.

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

initializeAdminApp({ databaseName: string }) => FirebaseApp

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai admin guna menyiapkan status untuk pengujian.

Menampilkan aplikasi Firebase admin yang diinisialisasi sesuai dengan nama database yang ditentukan dalam pilihan. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan ke database.

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

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

Gunakan metode ini untuk menetapkan aturan database Anda.

Mengirimkan aturan ke database yang berjalan secara lokal. Membawa objek pilihan yang menentukan "databaseName" dan "rules" Anda sebagai string.

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

apps() => [FirebaseApp]

Menampilkan semua pengujian yang saat ini diinisialisasi dan aplikasi admin.

Gunakan metode ini untuk menghapus data aplikasi di antara atau setelah pengujian (perhatikan bahwa aplikasi yang diinisialisasi dengan listener aktif membuat JavaScript tidak bisa keluar):

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

assertFails(pr: Promise) => Promise

Menampilkan promise yang ditolak jika input berhasil, dan berhasil jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan database gagal:

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

assertSucceeds(pr: Promise) => Promise

Menampilkan promise yang berhasil jika input berhasil, dan ditolak jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan database berhasil:

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