以互動方式測試函式

Cloud Functions 殼層提供互動殼層,可讓您使用測試資料叫用函式。殼層支援所有觸發條件類型。

設定管理員憑證 (選用)

如果想讓函式測試透過 Firebase Admin SDK 與 Google API 或其他 Firebase API 互動,您可能需要設定管理員憑證。

  • Cloud Firestore 和即時資料庫觸發條件已具備足夠的憑證,不需要進行其他設定
  • 至於其他 API,包括 Authentication API (例如 FCM) 或 Google API (例如 Cloud Translation 或 Cloud Speech) 時,都必須完成本節所述的設定步驟。無論是使用 Cloud Functions 殼層還是 firebase emulators:start,都適用。

如何為模擬函式設定管理員憑證:

  1. 開啟 Google Cloud 控制台的「服務帳戶」窗格
  2. 確認已選取「App Engine default service account」(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
    

完成上述步驟後,函式測試即可透過 Admin SDK 存取 Firebase 和 Google API。舉例來說,測試驗證觸發條件時,模擬函式可以呼叫 admin.auth().getUserByEmail(email)

使用 Cloud Functions 殼層提供函式

Cloud Functions 殼層會使用互動式殼層模擬所有類型的函式觸發條件,以便使用測試資料叫用函式。選項會依函式類型而有所不同,但基本使用格式如下:

myFunctionName(data, options)

即時資料庫、Cloud Firestore 和 Pub/Sub 觸發條件必須使用 data 參數,所有其他函式類型則為選用參數。此外,選用的 options 參數只適用於即時資料庫和 Cloud Firestore 函式。

您也可以選擇從本機檔案載入測試資料,方法是將檔案儲存為變數,然後透過檔案叫用函式:

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

安裝及設定 Cloud Functions 殼層

如要使用這項功能,firebase-tools 的最低版本需求為 3.11.0,firebase-functions SDK 的最低版本需求為 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 作業的舊/移除資料,以及 onUpdateonWrite 函式的測試資料:

# 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}})

根據預設,殼層會以管理員 (服務帳戶) 權限執行即時資料庫函式。請使用 auth 選項,以特定使用者或未經驗證的使用者的身分執行函式:

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

叫用 Firestore 函式

在本機執行 Firestore 函式時,您必須提供適當的測試資料。這通常意味著提供 onCreate 作業的新測試資料、onDelete 作業的舊/移除資料,以及 onUpdateonWrite 函式的新測試資料。請注意,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’} })

除了 data 物件的 before/after 欄位外,您還可以使用 options 物件的 params 欄位,在文件名稱中模擬萬用字元:

# 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 函式,請在 Buffer 執行個體中插入訊息酬載,並新增選用的資料屬性,如下所示:

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

叫用 Analytics 函式

您可以在殼層中執行 myAnalyticsFunction(),藉此叫用沒有任何資料的 Analytics (分析) 函式。如要使用測試資料執行函式,建議您為函式所需的特定事件資料欄位定義變數:

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);

叫用儲存和驗證函式

如果是儲存和驗證函式,請以您想在函式中查看的測試資料叫用本機函式。測試資料必須採用對應的資料格式:

僅指定程式碼依附的欄位,或只想執行函式時則完全不指定。