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
相关产品推荐
相关产品推荐

