You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest中依赖Firestore模拟器时的Promise异常问题

Firestore模拟器在Jest中runTransaction报错的解决方法

问题现象

使用Google Cloud Firestore模拟器时,调用global.db.runTransaction(async () => 100)在Node环境可正常运行,但在Jest的test函数中执行时抛出错误:

Error: You must return a Promise in your transaction()-callback.

原因分析

Firestore库内部会校验事务回调的返回值是否为Promise实例。在Jest环境中,async () => 100返回的对象虽然打印显示为Promise { 100 },但通过instanceof Promise判断结果为false,导致被判定为非Promise。不过单独编写测试验证async函数返回Promise的逻辑是可以通过的。

解决方案

最初尝试在jest.config.js中直接初始化global.db的方式无效,最终通过以下步骤解决:

  • 创建setup.js文件,在其中初始化全局db实例
  • 配置Jest的setupFilesAfterEnv加载该setup.js文件

另外,Jest的globals配置项因Firestore实例无法被JSON序列化,无法用于初始化全局db。

相关代码片段

原无效的jest.config.js配置

module.exports = async () => {
  const Firestore = require("@google-cloud/firestore");
  global.db = new Firestore({ projectId: process.env.GOOGLE_CLOUD_PROJECT });
  return {}
}

有效的setup.js内容

const Firestore = require("@google-cloud/firestore/build/src");
global.db = new Firestore({ projectId: process.env.GOOGLE_CLOUD_PROJECT });

内容的提问来源于stack exchange,提问作者AmitA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:48:19