如何在不使用现有文档的情况下触发Firestore云功能shell中的onCreate

时间:2017-11-17 09:08:48

标签: firebase google-cloud-functions google-cloud-firestore

我正在使用firebase-tools shell CLI来测试Firestore云功能。

我的函数通过使用通配符响应某个集合中所有文档的onCreate触发器,然后使用更新调用来改变该文档。

firestore
    .document(`myCollection/{documentId}`)
    .onCreate(event => {
      const ref = event.data.ref
      return ref.update({ some: "mutation"})
    })

在shell中我运行这样的东西,(传递我的数据库权限所需的一些伪auth数据):

myFunction({some: "data"}, { auth: { variable: { uid: "jj5BpbX2PxU7fQn87z10d4Ks6oA3" } } } )

但是这会导致错误,因为更新会尝试改变不在数据库中的文档。

  

错误:没有要更新的实体

documentation about unit testing中,解释了如何为ev​​ent.data创建模拟,以便在不触及实际数据库的情况下执行该函数。

但是我试图调用一个应该对数据库进行操作的实际函数。模拟没有意义,否则这只不过是一个单元测试。

我想知道调用这样一个函数的策略应该是什么?

通过使用文档的现有id,该函数可以成功执行,但这看起来很麻烦,因为您需要在数据库中查找每个测试,并且在某些时候它可能不再存在。

我认为如果shell会以某种方式根据您传入的数据创建一个新文档并从中运行触发器,那将非常有用。这可能是可能的,还是有另一种方式?

1 个答案:

答案 0 :(得分:0)

Cloud Functions模拟器只能模拟项目中可能发生的事件。它没有模拟对触发它的数据库的实际更改。

正如您所发现的那样,当您的功能取决于之前发生的实际变化时,您可能会遇到问题。事实是,在您处理函数中的事件时,可能已经删除了创建的文档(想象一下用户快速删除,但事件是因任何原因而延迟。)

所有这一切,也许你想使用set()和SetOptions,表明你想要合并而不是覆盖。请记住,如果在事件触发之前先删除了文档(有充分理由),您将无条件地重新创建文档,这可能与用户不同。