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),您都需要执行本部分中说明的设置步骤。无论您使用的是 Cloud Functions shell 还是
firebase emulators:start
,都需要遵循此要求。
如需为所模拟的函数设置管理员凭据,请执行以下操作:
- 在 Google Cloud 控制台中打开“服务帐号”窗格。
- 确保已选择 App Engine 默认服务帐号,并使用右侧的选项菜单选择创建密钥。
- 出现提示时,选择 JSON 作为密钥类型,然后点击创建。
将您的 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。例如,在测试 Authentication 触发器时,模拟的函数可以调用 admin.auth().getUserByEmail(email)
。
使用 Cloud Functions shell 提供函数
Cloud Functions shell 可通过交互式 shell 模拟所有类型的函数触发器,以使用测试数据调用函数。具体选项因函数类型而异,但基本使用格式为:
myFunctionName(data, options)
data
参数对于 Realtime Database、Cloud Firestore 和 PubSub 触发器是必需的,对于所有其他函数类型是可选的。此外,可选的 options
参数仅对 Realtime Database 和 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
。
调用 Realtime Database 函数
在本地运行 Realtime Database 函数时,您需要提供合适的测试数据。这通常意味着为 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
选项之外,shell 还提供 params
选项以用于模拟路径中的通配符:
# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})
默认情况下,shell 以管理员(服务帐号)权限运行 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’} })
除了 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: {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);
调用 Storage 和 Auth 函数
对于 Storage 函数和 Auth 函数,请使用您希望在函数中看到的测试数据来调用本地函数。您的测试数据必须符合相应的数据格式:
- 对于 Cloud Storage:
ObjectMetadata
- 对于 Authentication:
UserRecord
请仅指定您的代码依赖的字段;如果您只想运行该函数,请勿指定任何字段。