בנה מבחני יחידות

אמולטורי Firebase מקלים על אימות מלא של התנהגות האפליקציה שלך ומאמתים את תצורות כללי האבטחה של Firebase. השתמש באמולטורי Firebase כדי להריץ ולבצע בדיקות יחידה בסביבה מקומית. השיטות המתוארות במסמך זה אמורות לעזור לך בבניית אוטומציה של בדיקות יחידה לאפליקציה שלך המאמתות את הכללים שלך.

אם לא עשית זאת עדיין, להגדיר את אמולטורים Firebase .

לפני שאתה מפעיל את האמולטור

לפני שתתחיל להשתמש באמולטור, זכור את הדברים הבאים:

  • אמולטור בתחילה יטען הכללים המפורטים firestore.rules או בשדה "storage.rules" של שלך firebase.json קובץ. אם הקובץ אינו קיים ואתה לא להשתמש loadFirestoreRules או שיטת "loadStorageRules" כמתואר בהמשך, פינוקים אמולטור כל הפרויקטים כבעל כללים פתוח.
  • בעוד רוב Firebase SDKs עבודה עם אמולטורים ישירות, רק @firebase/rules-unit-testing תומך ספרייה לועג auth בכללי אבטחה, ביצוע בדיקות יחידות הרבה יותר קלות. בנוסף, הספרייה תומכת בכמה תכונות ספציפיות לאמולטור כמו ניקוי כל הנתונים, כמפורט להלן.
  • האמולטורים יקבלו גם אסימונים של יישום Firebase Auth המסופקים באמצעות SDK של לקוח ויבדקו כללים בהתאם, מה שמאפשר לחבר את היישום שלך ישירות לאמולטורים במבחני שילוב ובדיקות ידניות.

הבדלים בין אמולטורי מסד הנתונים לייצור

  • אינך צריך ליצור במפורש מופע מסד נתונים. האמולטור ייצור אוטומטית כל מופע מסד נתונים אליו ניגשת.
  • כל מסד נתונים חדש מתחיל בכללים סגורים, כך שמשתמשים שאינם מנהלי מערכת לא יוכלו לקרוא או לכתוב.
  • כל הנתונים לחיקוי מיישמת את תוכנית ספארק גבולות מכסות (ובעיקר, גבולות זה בכל מקרה כדי 100 חיבורים במקביל).
  • כל הנתונים יקבל את המחרוזת "owner" , כמנהל auth האסימון.
  • לאמולטורים אין כרגע אינטראקציות עבודה עם מוצרים אחרים של Firebase. יש לציין כי זרימת האימות הרגילה של Firebase אינה פועלת. במקום זאת, אתה יכול להשתמש initializeTestApp() שיטה של rules-unit-testing הספרייה, אשר לוקח auth שדה. אובייקט Firebase שנוצר בשיטה זו מתנהג כאילו הוא אומת בהצלחה כישות שתספק. אם אתה עובר ב null , זה יתנהג כמו משתמש לא מאומת ( auth != null כללים ייכשלו, למשל).

הפעל בדיקות מקומיות

השתמש @firebase/rules-unit-testing מודול כדי אינטראקציה עם אמולטור כי ריצות מקומית. אם אתה מקבל פסקי זמן או ECONNREFUSED שגיאות, בדוק כי אמולטור פועל למעשה.

אנו ממליצים להשתמש בגירסה האחרונה של Node.js כך שתוכל להשתמש async/await סימון. כמעט כל ההתנהגות שתרצה לבדוק כוללת פונקציות אסינכרוניות, ומודול הבדיקה נועד לעבוד עם קוד מבוסס הבטחה.

אינטראקציה עם אמולטור מסד הנתונים בזמן אמת

מופע באתר ייצור Firebase זמן אמת נגיש בכול תחום משנה של firebaseio.com , ואתה יכול לגשת ל- API של REST ככה:

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

אמולטור פועל באופן מקומי, והוא זמין localhost:9000 . כדי אינטראקציה עם מופע באתר ספציפי, תצטרך להשתמש ns פרמטר השאילתה כדי לציין את שם מסד הנתונים.

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

בדוק שיטות SDK

בחר מוצר כדי לראות את השיטות בהן נעשה שימוש ב- Firebase Test SDK לצורך ממשק עם האמולטור.

ענן Firestore

ענן Firestore

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

שיטה זו מחזירה אפליקציית Firebase מאותחלת המתאימה למזהה הפרויקט ומשתנה האימות שצוינו באפשרויות. השתמש באפשרות זו כדי ליצור אפליקציה מאומתת כמשתמש ספציפי לשימוש במבחנים.

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

initializeAdminApp({ projectId: string }) => FirebaseApp

שיטה זו מחזירה אפליקציית Firebase של מנהל אתחול. אפליקציה זו עוקפת את כללי האבטחה בעת ביצוע קריאה וכתיבה. השתמש באפשרות זו כדי ליצור אפליקציה מאומתת כמנהל להגדרת מצב לבדיקות.

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

apps() => [FirebaseApp] זה מחזיר שיטה כל מבחן אותחל כרגע ויישומים מנהל. השתמש בזה כדי לנקות אפליקציות בין הבדיקות או אחריהן.

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

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

שיטה זו שולחת כללים למסד נתונים הפועל באופן מקומי. נדרש אובייקט שמציין את הכללים כמחרוזת. השתמש בשיטה זו כדי לקבוע את כללי מסד הנתונים שלך.

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

assertFails(pr: Promise) => Promise

שיטה זו מחזירה הבטחה שנדחית אם הקלט מצליח או שמצליחה אם הקלט נדחה. השתמש באפשרות זו כדי לקבוע אם מסד נתונים בקריאה או כתיבה נכשל.

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

assertSucceeds(pr: Promise) => Promise

שיטה זו מחזירה הבטחה שתצליח אם הקלט יצליח ונדחה אם הקלט נדחה. השתמש בזה כדי לקבוע אם מסד נתונים שקורא או כותב מצליח.

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

clearFirestoreData({ projectId: string }) => Promise

שיטה זו מנקה את כל הנתונים המשויכים לפרויקט מסוים במופע Firestore הפועל באופן מקומי. השתמש בשיטה זו לניקוי לאחר בדיקות.

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

מסד נתונים בזמן אמת

מסד נתונים בזמן אמת

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

השתמש באפשרות זו כדי ליצור אפליקציה מאומתת כמשתמש ספציפי לשימוש במבחנים.

מחזיר אפליקציית Firebase מאותחלת המתאימה לשם מסד הנתונים ומשתנה האימות המוגדר באפשרויות.

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

initializeAdminApp({ databaseName: string }) => FirebaseApp

השתמש באפשרות זו כדי ליצור אפליקציה מאומתת כמנהל להגדרת מצב לבדיקות.

מחזיר אפליקציית firebase של מערכת מאותחלת המתאימה לשם מסד הנתונים שצוין באפשרויות. אפליקציה זו עוקפת את כללי האבטחה בעת קריאה וכתיבה למסד הנתונים.

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

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

השתמש בזה כדי לקבוע את כללי מסד הנתונים שלך.

שולח כללים למסד נתונים הפועל באופן מקומי. לוקח אובייקט אפשרויות שמציין את "שם הנתונים" ואת "הכללים" שלך כמחרוזות.

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

apps() => [FirebaseApp]

מחזירה את כל אפליקציות הבדיקה והניהול שעברו אתחול כרגע.

השתמש באפשרות זו כדי לנקות אפליקציות בין הבדיקות או אחריהן (שים לב שאפליקציות מאותחלות עם מאזינים פעילים מונעות יציאת JavaScript):

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

assertFails(pr: Promise) => Promise

מחזירה הבטחה שנדחית אם הקלט מצליח ומצליח אם הקלט נדחה.

השתמש באפשרות זו כדי לקבוע כי מסד נתונים שקורא או כותב נכשל:

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

assertSucceeds(pr: Promise) => Promise

מחזיר הבטחה שתצליח אם הקלט יצליח ונדחה אם הקלט נדחה.

השתמש באפשרות זו כדי לקבוע שמסד נתונים שקורא או כותב מצליח:

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

אחסון בענן

אחסון בענן

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

השתמש באפשרות זו כדי ליצור אפליקציה מאומתת כמשתמש ספציפי לשימוש במבחנים.

מחזירה אפליקציית Firebase מאותחלת המתאימה לשם דלי האחסון ועקיפת משתנה האימות שצוינו באפשרויות.

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

initializeAdminApp({ storageBucket: string }) => FirebaseApp

השתמש באפשרות זו כדי ליצור אפליקציה מאומתת כמנהל להגדרת מצב לבדיקות.

מחזירה אפליקציית firebase של מנהל מערכת מאותחלת המתאימה לשם דלי האחסון שצוין באפשרויות. אפליקציה זו עוקפת את כללי האבטחה בעת קריאה וכתיבה לדלי.

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

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

השתמש באפשרות זו כדי לקבוע את כללי דלי האחסון שלך.

שולח כללים לדלי אחסון בניהול מקומי. לוקח אובייקט אפשרויות שמציין את "storageBucket" ואת "הכללים" שלך כמחרוזות.

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

apps() => [FirebaseApp]

מחזירה את כל אפליקציות הבדיקה והניהול שעברו אתחול כרגע.

השתמש באפשרות זו כדי לנקות אפליקציות בין הבדיקות או אחריהן (שים לב שאפליקציות מאותחלות עם מאזינים פעילים מונעות יציאת JavaScript):

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

assertFails(pr: Promise) => Promise

מחזירה הבטחה שנדחית אם הקלט מצליח ומצליח אם הקלט נדחה.

השתמש באפשרות זו כדי לקבוע כי דלי אחסון לקרוא או לכתוב נכשלים:

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

assertSucceeds(pr: Promise) => Promise

מחזיר הבטחה שתצליח אם הקלט יצליח ונדחה אם הקלט נדחה.

השתמש בזה כדי לקבוע כי דלי אחסון לקרוא או לכתוב מצליחים:

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