Firestore规则测试时Mock数据初始化遇权限拒绝问题求助
解决Firestore规则测试中初始化数据时的权限拒绝问题
我来帮你分析下这个问题,你遇到的权限拒绝错误其实是因为测试数据初始化的顺序和Firebase规则加载的顺序搞反了。
问题根源
Firebase的测试SDK有个关键逻辑:所有针对Firestore的操作(包括初始化测试数据)都会受当前生效的安全规则约束。你当前的setup方法流程是:
- 创建测试App和Firestore实例
- 写入测试数据
- 加载自定义的Firestore规则
但在步骤2写入数据时,你的自定义规则还没有被加载,此时Firestore使用的是默认的安全规则(默认拒绝所有读写操作),所以写入数据的set操作触发了权限拒绝,抛出了你看到的PERMISSION_DENIED错误。
解决办法
调整setup方法的执行顺序,先加载Firestore规则,再初始化测试数据:
export const setup = async (auth?: any, data?: any) => { const projectId = `rules-spec-${Date.now()}`; // 第一步:先加载Firestore规则 await firebase.loadFirestoreRules({ projectId, rules: fs.readFileSync("firestore.rules").toString() }); // 第二步:创建测试App和Firestore实例 const app = firebase.initializeTestApp({ projectId, auth }); const db = app.firestore(); // 第三步:写入测试数据 if (data) { for (const key in data) { const ref = db.doc(key); await ref.set(data[key]); } } return db; };
额外说明
你写的Firestore规则和测试逻辑本身是没问题的,只要调整完setup的顺序,测试就能正常执行:
- 当你用
auth: { uid: "testid" }初始化测试App时,写入users/testid的数据会符合你的规则(isSignedIn() && userOwner(userId)),所以能成功写入 - 后续的
assertSucceeds和assertFails也会按照你的预期验证规则
内容的提问来源于stack exchange,提问作者Baptiste Arnaud
相关产品推荐
相关产品推荐

