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

Firebase Cloud Functions v2 Jest测试报错:TypeError: res.on is not a function

解决Cloud Functions v2带CORS配置时Jest测试「TypeError: res.on is not a function」错误

问题原因

当你给functions.https.onRequest添加{ cors: true }配置时,Firebase会自动为云函数包装一层CORS中间件。这个中间件会调用响应对象res的on方法,监听请求的finish或close事件以完成CORS相关的收尾逻辑。但你当前的测试mock中,res对象只实现了status和json方法,缺少on方法的实现,因此触发了类型错误。

解决方案

在测试用例的mock响应对象中,添加on方法的Jest mock实现即可。CORS中间件仅需调用该方法,不需要实际处理事件,所以直接用空的mock函数就能满足需求。

修改后的测试代码

describe('getuser function', () => {
  const req = {
    headers: { 'Content-Type': 'application/json' },
  }

  const res = {
    status: jest.fn().mockReturnThis(),
    json: jest.fn(),
    on: jest.fn(), // 新增:添加on方法的mock实现
  }
  
  test('function should be defined and callable', async () => {
    await getUserDetails(req, res)
    expect(getUserDetails).toBeDefined()
    // 可选:补充断言让测试更严谨
    expect(res.status).toHaveBeenCalledWith(200)
    expect(res.json).toHaveBeenCalled()
  })
})

额外说明

  • 若需要模拟CORS中间件的完整行为(比如测试OPTIONS请求),可以进一步完善on方法的mock逻辑,或者使用Firebase官方提供的firebase-functions-test工具,它能更真实地模拟云函数的运行环境。
  • 测试中的expect(getUserDetails).toBeDefined()无需等待函数执行完成,因为该断言是检查函数本身是否存在,而非执行结果,保留await也不会影响测试结果。

内容的提问来源于stack exchange,提问作者rai-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:47:17