我正在使用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中,解释了如何为event.data创建模拟,以便在不触及实际数据库的情况下执行该函数。
但是我试图调用一个应该对数据库进行操作的实际函数。模拟没有意义,否则这只不过是一个单元测试。
我想知道调用这样一个函数的策略应该是什么?
通过使用文档的现有id,该函数可以成功执行,但这看起来很麻烦,因为您需要在数据库中查找每个测试,并且在某些时候它可能不再存在。
我认为如果shell会以某种方式根据您传入的数据创建一个新文档并从中运行触发器,那将非常有用。这可能是可能的,还是有另一种方式?
答案 0 :(得分:0)
Cloud Functions模拟器只能模拟项目中可能发生的事件。它没有模拟对触发它的数据库的实际更改。
正如您所发现的那样,当您的功能取决于之前发生的实际变化时,您可能会遇到问题。事实是,在您处理函数中的事件时,可能已经删除了创建的文档(想象一下用户快速删除,但事件是因任何原因而延迟。)
所有这一切,也许你想使用set()和SetOptions,表明你想要合并而不是覆盖。请记住,如果在事件触发之前先删除了文档(有充分理由),您将无条件地重新创建文档,这可能与用户不同。