בדיקה אינטראקטיבית של פונקציות

המעטפת של Cloud Functions מספקת מעטפת אינטראקטיבית להפעלה עם נתוני הבדיקה. המעטפת תומכת בכל סוגי הטריגרים.

הגדרת פרטי כניסה של אדמין (אופציונלי)

אם אתם רוצים שבדיקות הפונקציות יתקשרו ל-Google APIs או ל-Firebase APIs אחרים דרך Firebase Admin SDK, יכול להיות שתצטרכו להגדיר פרטי כניסה של אדמין.

  • לטריגרים של Cloud Firestore ו-Realtime Database כבר יש פרטי כניסה מספיקים, והם לא מחייבים הגדרה נוספת.
  • לכל שאר ממשקי ה-API, כולל ממשקי API של Firebase כמו Authentication ו-FCM, או Google APIs כמו Cloud Translation או Cloud Speech, נדרשים שלבי ההגדרה שמתוארים בקטע הזה. האפשרות הזו רלוונטית גם אם משתמשים במעטפת Cloud Functions וגם אם משתמשים ב-firebase emulators:start.

כדי להגדיר פרטי כניסה של אדמין לפונקציות אמולציה:

  1. פותחים את החלונית Service Accounts במסוף Google Cloud.
  2. מוודאים שהאפשרות חשבון שירות אחד (App Engine) שמוגדר כברירת מחדל מסומנת, ומשתמשים בתפריט האפשרויות שמשמאל כדי לבחור באפשרות Create key.
  3. כשמופיעה בקשה, בוחרים באפשרות JSON בתור סוג המפתח ולוחצים על יצירה.
  4. מגדירים את פרטי הכניסה שמוגדרים כברירת מחדל ל-Google כך שיפנו למפתח שהורדתם:

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

אחרי שתשלימו את השלבים האלה, בדיקות הפונקציות יוכלו לגשת ל-Firebase Google APIs באמצעות Admin SDK. לדוגמה, כאשר מבצעים בדיקה טריגר Authentication, הפונקציה האמולציה יכולה להפעיל admin.auth().getUserByEmail(email).

הצגת פונקציות באמצעות מעטפת של Cloud Functions

המעטפת של Cloud Functions מבצעת אמולציה של כל סוגי הטריגרים של פונקציות באמצעות מעטפת אינטראקטיבית להפעלת הפונקציות עם נתוני בדיקה. האפשרויות משתנות לפי סוג הפונקציה, אבל פורמט השימוש הבסיסי הוא:

myFunctionName(data, options)

הפרמטר data נדרש למסד נתונים בזמן אמת, Cloud Firestore, והטריגרים של PubSub, ואופציונלי לכל סוגי הפונקציות האחרים. כמו כן, הפרמטר האופציונלי options תקף רק למסד נתונים בזמן אמת והפונקציות של Cloud Firestore.

אפשר גם לטעון נתוני בדיקה מקובץ מקומי. לשם כך, שומרים את הקובץ כמשתנה ומפעילים פונקציה באמצעותו:

var data = require('./path/to/testData.json');
myFunction(data);

התקנה והגדרה של מעטפת Cloud Functions

כדי להשתמש בתכונה הזו, גרסת firebase-tools צריכה להיות 3.11.0 לפחות, וגרסת ה-SDK של firebase-functions צריכה להיות 0.6.2 לפחות. כדי לעדכן את שניהם, מריצים את הפקודות הבאות בספרייה functions/ של הפרויקט:

npm install --save firebase-functions@latest
npm install -g firebase-tools

אם אתם משתמשים במשתני הגדרה מותאמים אישית של פונקציות, תחילה מריצים את הפקודה כדי לקבל את ההגדרות המותאמות אישית (מריצים את הפקודה בתוך הספרייה functions) בסביבה המקומית:

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

לבסוף, מריצים את המעטפת באמצעות הפקודה הבאה:

firebase functions:shell

הפעלת פונקציות HTTPS

להפעלת פונקציות HTTPS במעטפת, השימוש זהה request מודול NPM, אבל החלפה request בשם הפונקציה שרוצים לאמולה. לדוגמה:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

הפעלת פונקציות HTTPS שניתנות לקריאה

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

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

אפשר גם להעביר את הערך Firebase-Instance-ID-token כפרמטר השני. הערך הזה חייב להיות מחרוזת.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

האמולציה של context.auth לא זמינה כרגע.

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

כשמריצים פונקציות של מסד נתונים בזמן אמת באופן מקומי, צריך לספק נתוני הבדיקה המתאימים. בדרך כלל, צריך לספק נתוני בדיקה חדשים לפעולות onCreate, נתונים ישנים/שהוסר לפעולות onDelete וגם לפעולות onUpdate או onWrite:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

בנוסף לאפשרויות before/after, המעטפת מספקת את הערך params אפשרות לשימוש בתווים כלליים לחיפוש לועג בנתיב:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

כברירת מחדל, המעטפת מפעילה פונקציות של Realtime Database עם הרשאות אדמין (חשבון שירות). אפשר להשתמש באפשרות auth כדי להריץ פונקציות בתור משתמש קצה מסוים, או בתור משתמש לא מאומת:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

הפעלת פונקציות Firestore

כשמריצים פונקציות של Firestore באופן מקומי, צריך לספק נתוני בדיקה מתאימים. בדרך כלל, צריך לספק נתוני בדיקה חדשים לפעולות onCreate, נתונים ישנים/שהוסר לפעולות onDelete וגם לפעולות onUpdate או onWrite. חשוב לזכור שנתוני Firestore חייבים להיות צמדי מפתח/ערך. אפשר לעיין במאמר סוגי נתונים נתמכים.

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

בנוסף לשדות before/after של האובייקט data, אפשר להשתמש בשדות params באובייקט options כדי לדמות תווים כלליים לחיפוש בשם המסמך:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: new’}, {params: {group: 'a', id: 123}})

המעטפת תמיד מפעילה פונקציות Firestore עם הרשאות אדמין, הוא לועג ליצירה/עדכון/מחיקה של אירוע, כאילו הוא בוצע על ידי משתמש עם הרשאת אדמין.

הפעלה של פונקציות PubSub

בפונקציות PubSub, צריך להוסיף את המטען הייעודי (payload) של ההודעות למכונה של Buffer. אפשר להוסיף מאפייני נתונים (אופציונלי) כפי שמוצג כאן:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

הפעלת פונקציות של Analytics

ניתן להפעיל פונקציה של Analytics ללא נתונים על ידי שמריצים את myAnalyticsFunction() במעטפת. כדי להריץ את הפונקציה עם נתוני בדיקה, מומלץ להגדיר משתנה השדות הספציפיים של נתוני האירועים שהפונקציה צריכה:

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

קריאה לפונקציות של אחסון ואימות

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

ציין רק את השדות שבהם הקוד תלוי, או לא לציין כלל אם שרוצים להריץ את הפונקציה.