如何使用firebase-functions-test测试需认证的Firebase云函数
测试需登录的Firebase Callable云函数
要模拟登录用户测试Callable云函数,核心是在调用包装后的函数时,将认证信息传入上下文参数,而非依赖客户端登录方法。以下是具体实现步骤:
核心原理
firebase-functions-test的wrap()方法返回的函数接受两个参数:
- 第一个参数是前端调用时传入的业务数据
- 第二个参数是云函数的上下文对象,其中的
auth字段就是函数内request.auth的来源
你之前尝试传递认证信息时,大概率是把auth放在了业务数据参数里,导致函数无法识别。
具体测试步骤
1. 初始化测试环境
确保使用测试环境配置,避免影响生产数据:
const test = require('firebase-functions-test')({ projectId: 'your-test-project-id', // 按需添加databaseURL、storageBucket等配置 }); const myFunctions = require('../path-to-your-function-file');
2. 编写测试用例
测试未登录场景
验证函数在无认证时抛出正确错误:
it('拒绝未登录用户调用', async () => { const wrapped = test.wrap(myFunctions.exampleEndpoint); await expect(wrapped({})).rejects.toThrow('unauthenticated'); });
测试已登录场景
通过上下文参数传入模拟的认证用户信息:
it('允许已登录用户调用', async () => { const wrapped = test.wrap(myFunctions.exampleEndpoint); // 构造模拟的认证上下文 const mockAuthContext = { auth: { uid: 'test-user-001', // 如果函数用到其他字段(如email),可按需添加 email: 'test@example.com' } }; // 调用函数:第一个参数是业务数据,第二个是上下文 const result = await wrapped({ /* 传入你的业务数据 */ }, mockAuthContext); // 根据函数逻辑编写断言,比如验证返回结果 expect(result).toEqual(/* 预期的返回值 */); });
3. (可选)模拟真实ID Token
如果函数需要验证Token有效性(比如检查自定义声明),可以用test.mockIdToken()生成模拟Token:
it('验证带自定义声明的用户', async () => { const wrapped = test.wrap(myFunctions.exampleEndpoint); // 生成带自定义声明的模拟Token const mockToken = await test.mockIdToken('test-user-001', { isAdmin: true }); const mockAuthContext = { auth: { uid: 'test-user-001', isAdmin: true }, rawToken: mockToken // 将Token传入上下文 }; const result = await wrapped({}, mockAuthContext); // 验证函数处理逻辑 });
为什么之前的方法无效
signInWithEmailAndPassword():这是客户端SDK的登录方法,测试环境直接执行云函数代码,不会关联客户端的Auth会话,因此无效。- 错误的参数位置:你之前传递
{ auth: ... }时,可能把它放在了业务数据参数里,而非上下文参数,导致request.auth无法读取。 - 回退到v1版本:完全没必要,v2版本的测试逻辑和v1一致,仅API细节略有不同。
内容的提问来源于stack exchange,提问作者Reid Moffat
相关产品推荐
相关产品推荐

