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

如何为启用App Check的Firebase可调用云函数添加调试令牌以完成单元测试?

Testing Firebase Callable Functions Protected by App Check

当你的可调用函数启用了App Check强制校验后,单元测试时确实会因为context.app为undefined而触发错误。不过不用真的生成App Attest令牌来测试——Firebase的Functions Test SDK允许我们直接模拟通过App Check验证的上下文,这样就能跳过服务端的App Check校验,专注测试你的业务逻辑。

核心解决方案:模拟上下文对象

在调用test.wrap返回的函数时,你可以传入第二个参数作为函数的context对象。只要在这个对象里加入app字段(哪怕只是一个简单的结构),就能通过你代码里的context.app === undefined检查。

修改你的测试代码如下:

it("tests a simple callable function", async () => {
  const wrapped = test.wrap(myFunctions.sayHelloWorld);
  const data = { eventName: "New event" };
  
  // 模拟已通过App Check验证的上下文
  const mockContext = {
    app: {
      appId: "com.yourcompany.yourapp" // 可以填你实际的iOS App ID,或者任意测试ID
    }
  };
  
  // 传入数据和模拟上下文调用函数
  const result = await wrapped(data, mockContext);
  
  // 验证结果是否符合预期
  expect(result).to.eql({ c: 3 });
});

为什么这能生效?

在本地单元测试环境中,Firebase Functions Test不会触发真实的App Check校验流程——它完全依赖你传入的context对象来模拟请求环境。所以只要context.app存在,你的前置条件检查就会通过,函数就能执行后续的业务逻辑。

扩展:测试校验失败的场景

如果你还想测试“未通过App Check”的错误分支,只需要不传app字段,或者将其设为undefined:

it("throws error when App Check fails", async () => {
  const wrapped = test.wrap(myFunctions.sayHelloWorld);
  const data = { eventName: "New event" };
  
  // 模拟未通过App Check的上下文(不传入app字段)
  await expect(wrapped(data)).to.be.rejectedWith(functions.https.HttpsError);
});

这样你就能完整覆盖函数里的两种分支逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:02:41