如何在本地测试firebase触发器以进行存储?

时间:2017-11-03 13:20:09

标签: firebase google-cloud-functions

我有一个以这样的触发器开始的功能:

exports.generateThumbnail = functions.storage.object().onChange(event => {

如何在本地测试?我已经阅读了Firebase的本地测试文档,但是有人可以给我一个如何在本地触发此示例的示例,目前有点令人困惑。谢谢!

1 个答案:

答案 0 :(得分:11)

要在本地测试Firebase云功能,您有两种选择:

  • Cloud Functions Shell
  • Firebase CLI

后者仅适用于HTTPS功能,因此它实际上与您的目的无关(您正在测试存储触发功能)。

让我们从项目的functions目录中调用Cloud Functions Shell:

$ npm i -g firebase-tools@latest
...

$ firebase --version
3.17.3

$ firebase experimental:functions:shell
i  functions: Preparing to emulate functions.
✔  functions: generateThumbnail
firebase >

这为您提供了一个交互式shell,您可以在其中直接执行函数:

firebase > generateThumbnail()
'Successfully invoked function.'
...

或者其他任何JavaScript代码:

firebase > console.log(Math.random())
0.17387339404246105
undefined

在本地测试函数时,您将无法收到真正的Firebase存储事件,因此,您必须使用测试数据调用函数。

来自official documentation

  

对于Storage,Auth和Crashlytics函数,调用本地   使用您希望在其中查看的测试数据   功能。您的测试数据必须遵循相应的数据格式:

     
      
  • 云存储:ObjectMetadata
  •   
  • 用于身份验证:UserRecord
  •   
  • 对于Crashlytics:问题
  •   
     

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

好的,接下来你需要创建一些符合ObjectMetadata

的测试数据

在项目的testData.json目录中创建一个包含以下内容的文件functions。请注意相应的ObjectMetadata字段:

{
  "bucket": "unique-name-of-your-app.appspot.com",
  "contentDisposition": "inline; filename*=utf-8''test.png",
  "contentType": "image/png",
  "crc32c": "LaOnCg==",
  "etag": "CeDut9jz5dgCFAE=",
  "generation": "1416567827822212",
  "id": "unique-name-of-your-app.appspot.com/test.png/1416567827822212",
  "kind": "storage#object",
  "md5Hash": "N2rxNWE0ZGRtZmE0Y2M2NDIyOWY5NzIeNzA4YzdizjU=",
  "mediaLink": "https: //www.googleapis.com/download/storage/v1/b/unique-name-of-your-app.appspot.com/o/test.png?generation=1416567827822212&alt=media",
  "metadata": {
    "firebaseStorageDownloadTokens": "1cbc7278-9e5b-4d05-a5de-91a3a067a4bc"
  },
  "metageneration": "1",
  "name": "test.png",
  "resourceState": "not_exists",
  "selfLink": "https: //www.googleapis.com/storage/v1/b/unique-name-of-your-app.appspot.com/o/test.png",
  "size": "168501",
  "storageClass": "STANDARD",
  "timeCreated": "2018-01-21T20: 33: 47.739Z",
  "timeDeleted": "2018-01-21T20: 33: 58.207Z",
  "timeStorageClassUpdated": "2018-01-21T20: 33: 47.739Z",
  "updated": "2018-01-21T20: 33: 47.739Z"
}

正如文档所说,您不一定需要所有这些字段,使用您实际需要的字段进行测试。

现在您可以返回Cloud Functions Shell并导入测试数据:

firebase > const testData = require('./testData.json')
undefined

使用测试数据作为参数调用函数:

firebase > generateThumbnail(testData)
'Successfully invoked function.'
...

要进一步自动化,您还可以创建包含以下内容的testFunction.js文件:

const testData = require('./testData.json');
generateThumbnail(testData);

现在,您不必手动将所有这些输入到Cloud Functions Shell中,而只需从操作系统的shell中执行它,并通过标准输入重定向testFunction.js

$ firebase experimental:functions:shell < ./testFunction.js 
i  functions: Preparing to emulate functions.
✔  functions: generateThumbnail
firebase > const testData = require('./testData.json');
undefined
firebase > generateThumbnail(testData);
'Successfully invoked function.'
...

希望这有帮助。