Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

以交互方式测试函数

Cloud Functions shell 提供一个交互式 shell,以便您使用测试数据调用函数。该 shell 支持所有触发器类型。

设置管理员凭据(可选)

如果您希望自己的函数测试通过 Firebase Admin SDK 与 Google API 或其他 Firebase API 进行交互,则可能需要设置管理员凭据。

  • Cloud Firestore 和 Realtime Database 触发器已经有足够的凭据,需要额外设置。
  • 所有其他 API(包括 Authentication 和 FCM 等 Firebase API,或 Cloud Translation 和 Cloud Speech 等 Google API)都需要执行本部分中介绍的设置步骤。无论您使用的是函数 shell 还是 firebase emulators:start,都需要遵循此要求。

要为所模拟的函数设置管理员凭据,请执行以下操作:

  1. 在 Google Cloud Console 中打开“服务帐号”窗格
  2. 确保已选择 App Engine 默认服务帐号,并使用右侧的选项菜单选择创建密钥
  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 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 Callable 函数

在本地调用 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'}})

调用 Analytics 函数

通过在 shell 中运行 myAnalyticsFunction(),您无需任何数据即可调用 Analytics 函数。要使用测试数据运行该函数,建议您为函数所需的特定事件数据字段定义一个变量:

var data = {
  eventDim: [{
    // populates event.data.params
    params:{foo:'bar'},
    // 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);

调用 Cloud Storage 函数、身份验证函数和 Crashlytics 函数

对于 Cloud Storage 函数、身份验证函数和 Crashlytics 函数,请使用您希望在函数中看到的测试数据来调用本地函数。您的测试数据必须符合相应的数据格式:

请仅指定您的代码依赖的字段;如果您只想运行该函数,请勿指定任何字段。