获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

交互式测试功能

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 Console 的服务帐户窗格
  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 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 可调用函数时,您需要提供适当的测试数据。

# 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:'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);

调用 Storage 和 Auth 函数

对于 Storage 和 Auth 函数,使用您希望在函数内部看到的测试数据调用本地函数。您的测试数据必须遵循相应的数据格式:

仅指定您的代码所依赖的字段,或者如果您只想运行该函数,则根本不指定。