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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:00:04