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

如何使用firebase-functions-test测试需认证的Firebase云函数

测试需登录的Firebase Callable云函数

要模拟登录用户测试Callable云函数,核心是在调用包装后的函数时,将认证信息传入上下文参数,而非依赖客户端登录方法。以下是具体实现步骤:

核心原理

firebase-functions-test的wrap()方法返回的函数接受两个参数:

  1. 第一个参数是前端调用时传入的业务数据
  2. 第二个参数是云函数的上下文对象,其中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:11