如何为启用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
相关产品推荐
相关产品推荐

