如何在Firebase模拟器中测试删除集合(firebase_tools.firestore.delete与云(而非模拟器)对话)

时间:2019-08-24 19:46:33

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

我正在尝试在模拟器中测试Firebase云功能。我已经能够在模拟器中对数据进行火存储。我可以在模拟器中调用云函数。但是我删除集合的功能是向Google Cloud扩展,而不是在模拟器中执行操作。

要删除集合,Google建议您使用“ firebase_tools”执行操作(https://firebase.google.com/docs/firestore/solutions/delete-collections)。

这是我在模拟器中运行的云功能的简化版本:

//Delete a firestore document.  
//When run in the emulator, this will successfully delete the piece of data in our emulator.
const paPath = FirebasePathUtils.getTeamPropertyAnalysisPath(pa.parentTeamId, pa.parentWorkspaceId, pa.id);
const p1 = admin.firestore().doc(paPath).delete();

//Delete all data in a collection.  
//When run in the emulator this IS REACHING OUT TO THE REAL CLOUD NOT USING THE EMULATOR.
const paDataPath = FirebasePathUtils.getTeamPropertyAnalysisDataPath(teamId, wsId, paId);
const pa2 = firebase_tools.firestore
   .delete(paDataPath, {
     project: process.env.GCLOUD_PROJECT,
     recursive: true,
     yes: true,
     token: functions.config().fb.token
   })
   .then( () => {
     console.log(`Successfully Deleted data under ${paDataPath}`);
   });

return Promise.all([p1, p2]);

当我在模拟器中运行cloud函数,并使用“ firebase_toosl”执行delete收集代码时,我得到了输出

Google API requested!
   - URL: "https://firestore.googleapis.com/v1beta1/projects/reitools-test/databases/(default)/documents/teamdata/-LjcN--jRrirOzDD0e3I/workspace_data/-LjcN-vktqOC8BJR_8X1/property_analyses_data/-LgJZf7GLRetC2fsVRvb"
   - Be careful, this may be a production service.
⚠  Google API requested!
   - URL: "https://firestore.googleapis.com/v1beta1/projects/reitools-test/databases/(default)/documents/teamdata/-LjcN--jRrirOzDD0e3I/workspace_data/-LjcN-vktqOC8BJR_8X1/property_analyses_data/-LgJZf7GLRetC2fsVRvb:runQuery"
   - Be careful, this may be a production service.

关于如何获得“ firebase_tools”以对模拟器执行操作的任何想法?

1 个答案:

答案 0 :(得分:0)

我发现距您发布问题已经8个月了。希望您已经解决了问题。

如果不是,对于那些在这里居住的人来说,问题在于您的环境变量“ process.env.GCLOUD_PROJECT”。

我相信在您的测试中,您正在初始化类似的Firestore实例:

firebase.initializeAdminApp({ projectId: 'deletetest' }).firestore()

在这种情况下,您应该用'deletetest'覆盖GCLOUD_PROJECT变量,该变量是您模拟的项目实例的projectId。

就像

一样简单
process.env.PROJECT_ID = 'deleteclub'

我认为使用Jest变量只会覆盖测试文件,因此,如果其他测试需要此环境变量,则不会导致任何问题,当然,您需要在需要的地方为每个测试覆盖该变量。

我希望这会使某人感到高兴:)

干杯!