我正在尝试验证我的输入作为我的firestore规则的一部分。
假设我有一个用户文档,它是一个简单的对象,包含Firestore时间戳,文档ID是uid。我正在为我的规则编写单元测试,并希望区分如下有效的测试:
{ creationDate: FirestoreTimestamp.fromDate(new Date()) }
和一个无效的像这样:
{ creationDate: new Date() }
我的firestore.rules
有这个规则:
match /users/{userId} {
allow create: if (creationDate != null && creationDate is timestamp)
}
我正在编写单元测试来验证我的规则,并希望确保Firestore Timestamps是唯一有效的输入。
所以我写了一个单元测试,我们给这个字段分配了一个不同类型的时间值,这个单元测试预计会失败:
it('Fails if creationDate is not a Firestore timestamp', async () => {
// Arrange
const authedUser = testEnv.authenticatedContext(myId);
const db = authedUser.firestore();
const docRef = doc(db, 'users', myId);
const docData = { dateCreated: new Date()};
// Act & Assert
await assertFails(setDoc(docRef, docData));
});
但它不起作用。当我运行测试时,我得到错误Error: Expected request to fail, but it succeeded.
1条答案
按热度按时间m0rkklqb1#
客户端希望此字段具有Firestore Timestamp类型。
如果您将
Timestamp
或Date
值传递给Firestore,它将存储为Timestamp
值。所以你给予的代码:具有与以下相同的结果:
如果希望以纳秒精度存储该值,则应用途:
如果您从Timestamp字段中检索该值,则它将作为
Timestamp
对象返回,如果需要,您可以从中获取Date
值。因此,即使最初传入了一个
Date
对象,从数据库返回的值也将是一个Timestamp
对象。