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

测试Firebase Functions onUpdate触发器时遇TypeError:无法读取val属性

解决Firebase Functions测试中change.after.val() undefined的问题

嘿,我之前测试Realtime Database触发器时也踩过这个一模一样的坑!问题出在你给测试用的函数传入的参数类型不对——onUpdate和onWrite触发器的函数接收的是一个包含before和after快照的change对象,而不是单个的DataSnapshot。

你现在的测试代码直接传了一个snapshot给wrap后的函数,这就导致函数里的change其实是单个快照,自然没有after和before属性,调用change.after.val()就会抛出TypeError了。而生产环境中Firebase会自动为触发器生成正确的change对象,所以部署后运行完全正常。

正确的测试写法

你需要用Firebase Test SDK提供的makeChange方法,手动构造包含before和after快照的change对象:

describe("mirrorTransactionUpdates", () => {
  it("should update transactions in firestore", () => {
    const oldData = {}; // 可以根据测试场景设置旧数据,比如空对象或历史数据
    const newData = {date: 1};
    
    // 创建更新前后的两个数据快照
    const beforeSnapshot = test.database.makeDataSnapshot(oldData, "transactions/test_transaction_id");
    const afterSnapshot = test.database.makeDataSnapshot(newData, "transactions/test_transaction_id");
    
    // 用Test SDK构造符合触发器要求的change对象
    const change = test.database.makeChange(beforeSnapshot, afterSnapshot);
    
    return test.wrap(activeFunctions.mirrorTransactionUpdates)(change, { 
      params: {id: "test_transaction_id"} 
    }).then(() => {
      return firestore.collection("transactions").doc("test_transaction_id").get()
        .then(mirroredDoc => {
          assert.deepEqual(mirroredDoc.data(), newData);
        });
    });
  });
});

关键点说明

  • onUpdate触发器要求第一个参数是Change<DataSnapshot>类型,必须包含before(更新前快照)和after(更新后快照)两个属性
  • makeChange是Test SDK专门用来生成这个标准change对象的工具方法
  • 对于onWrite触发器,测试逻辑完全一致,同样需要构造完整的change对象传入

这样修改后,你的测试就能正确模拟生产环境的触发器参数,change.after.val()就能正常获取到数据啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:33:35