Firestore安全规则timestamp字段校验的单元测试实现咨询
问题原因
- 测试环境返回的
firestore实例上不会挂载FieldValue属性,该属性是Firebase SDK的顶层导出对象,不能从单实例上直接读取,这是你第一次报错的原因。 firebase-admin的FieldValue是服务端SDK专属实现,和测试套件模拟的客户端环境不兼容,会被识别为无效自定义对象,这是你第二次报错的原因。
正确解决方法
你可以直接使用@firebase/rules-unit-testing内置导出的serverTimestamp哨兵值,无需额外引入其他SDK,修正后代码如下:
// 顶部导入测试库内置的serverTimestamp方法 import { initializeTestEnvironment, RulesTestEnvironment, assertSucceeds, assertFails, serverTimestamp } from "@firebase/rules-unit-testing"; let testEnvironment: RulesTestEnvironment = await initializeTestEnvironment({ projectId: PROJECT_ID, firestore: { rules: fs.readFileSync("../firestore.rules", "utf8"), host: "localhost", port: 8080 } }) const firestore = testEnvironment.authenticatedContext("user_123").firestore() const testDoc = firestore.doc("/writers/user_123") // 调用内置serverTimestamp方法即可 await assertSucceeds(testDoc.update( "some_field", "some_value", "updatedAt", serverTimestamp() ))
补充反向测试用例
你可以补充反向用例验证规则的有效性,确保用户不使用serverTimestamp时会被拦截:
// 传入普通时间对象而不是serverTimestamp哨兵,应该触发规则校验失败 await assertFails(testDoc.update( "some_field", "some_value", "updatedAt", new Date() ))
内容的提问来源于stack exchange,提问作者Akshay Jain
相关产品推荐
相关产品推荐

