交互式測試功能

Cloud Functions shell 提供了一個互動式 shell,用於使用測試資料呼叫函數。 shell 支援所有觸發器類型。

設定管理員憑證(可選)

如果您希望函數測試透過Firebase Admin SDK與 Google API 或其他 Firebase API 交互,則可能需要設定管理員憑證。

  • Cloud Firestore 和即時資料庫觸發器已擁有足夠的憑證,並且不需要額外的設定。
  • 所有其他 API,包括 Firebase API(如身份驗證和 FCM)或 Google API(如 Cloud Translation 或 Cloud Speech),都需要執行本節中所述的設定步驟。無論您使用的是 Cloud Functions shell 還是firebase emulators:start這都適用。

若要為模擬功能設定管理員憑證:

  1. 開啟 Google Cloud 控制台的服務帳號窗格
  2. 確保選擇App Engine 預設服務帳戶,然後使用右側的選項選單選擇Create key
  3. 出現提示時,選擇JSON作為金鑰類型,然後按一下Create
  4. 將您的 Google 預設憑證設定為指向下載的金鑰:

    Unix

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

    視窗

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

完成這些步驟後,您的功能測試可以使用Admin SDK存取 Firebase 和 Google API。例如,在測試身份驗證觸發器時,模擬函數可以呼叫admin.auth().getUserByEmail(email)

使用 Cloud Functions shell 提供函數服務

Cloud Functions shell 使用互動式 shell 模擬所有類型的函數觸發器,以使用測試資料呼叫函數。選項因函數類型而異,但基本使用格式為:

myFunctionName(data, options)

data參數對於即時資料庫、Cloud Firestore 和 PubSub 觸發器是必需的,對於所有其他函數類型是可選的。此外,可選options參數僅對即時資料庫和 Cloud Firestore 函數有效。

或者,您可以透過將檔案儲存為變數並使用它來呼叫函數來從本機檔案載入測試資料:

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

安裝和設定 Cloud Functions shell

要使用此功能, 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

最後,使用以下命令執行 shell:

firebase functions:shell

呼叫HTTPS函數

對於在 shell 中呼叫 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 Callable 函數時,您需要提供適當的測試資料。

# 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選項之外,shell 還提供params選項用於模擬路徑中的通配符:

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

預設情況下,shell 使用管理員(服務帳戶)權限來執行即時資料庫功能。使用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}})

shell 總是以管理權限執行 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'}})

呼叫分析功能

您可以透過在 shell 中執行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);

呼叫儲存和驗證功能

對於儲存和身份驗證函數,使用您希望在函數內部看到的測試資料來呼叫本機函數。您的測試資料必須遵循相應的資料格式:

僅指定您的程式碼所依賴的字段,或者如果您只想運行該函數,則根本不指定字段。