使用Firebase DB模拟器测试时,如何清库并避免PERMISSION_DENIED错误
问题原因
你使用绑定了普通用户身份的测试应用执行根节点清空操作,该操作被你配置的Realtime Database安全规则拦截,才会触发PERMISSION_DENIED报错——正常的安全规则配置必然不会开放普通用户删除整库的权限。
解决方案
使用@firebase/testing提供的管理员应用实例执行清空操作,该实例的所有操作默认绕过安全规则校验,不会被权限拦截。你可以修改beforeEach逻辑如下:
describe('test', () => { beforeEach(async () => { // 创建绕过安全规则的管理员应用 const adminApp = firebase.initializeAdminApp({ databaseName: 'mydb' }); // 用管理员应用清空数据库,不会触发权限报错 await adminApp.database().ref().set(null); // 清空完成后删除临时管理员应用,避免实例冲突 await adminApp.delete(); // 加载安全规则后再执行后续测试 await firebase.loadDatabaseRules({ databaseName: 'mydb', rules: fs.readFileSync('database.rules.json', 'utf8'), }); }); // 剩余代码保持不变 afterAll(async () => { await Promise.all(firebase.apps().map((app) => app.delete())); }); it('test', async (done) => { // ... // }); }
注意事项
- 测试用的业务操作需要用绑定了对应身份的普通测试应用执行,避免绕过规则导致测试结果不符合预期
- 临时创建的管理员应用用完后及时清理,避免多个应用实例互相干扰
内容的提问来源于stack exchange,提问作者Simon Tran
相关产品推荐
相关产品推荐

