测试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
相关产品推荐
相关产品推荐

