首页 > 解决方案 > Firestore 安全规则中的单元测试时间戳字段规则

问题描述

我正在使用 node.js 库为我的 firestore 安全规则编写单元测试@firebase/rules-unit-testing

这是我更新文档的安全规则:

allow update: if request.auth.uid != null &&
  request.auth.uid == userId &&
  request.resource.data.updatedAt == request.time;

我希望该updatedAt字段始终设置为FieldValue.serverTimestamp().

在我的单元测试中,我试图更新值FieldValue.serverTimestamp()并验证它是否应该成功。这是我的代码片段:

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")
await assertSucceeds(testDoc.update(
  "some_field", "some_value", "updatedAt", firestore.FieldValue.serverTimestamp()
))

在这种情况下,firestore.FieldValue未定义。

我尝试使用 admin SDK firebase-admin,将最后一条语句更改为:

await assertSucceeds(testDoc.update(
  "some_field", "some_value", "updatedAt", admin.firestore.FieldValue.serverTimestamp()
))

为此,我得到了错误-

FirebaseError:使用无效数据调用函数 DocumentReference.update()。不支持的字段值:自定义对象(在文档 writers/user_123 的字段 updatedAt 中找到)

谁能建议如何为时间戳字段更新添加测试?

标签: typescriptfirebasegoogle-cloud-firestorefirebase-security

解决方案


您传递的数据格式不正确

尝试这个:

await assertSucceeds(testDoc.update(
  {some_field: "some_value", updatedAt: admin.firestore.FieldValue.serverTimestamp()})

推荐阅读