使用Firebase DB模拟器,如何在测试之间清除数据库并避免PERMISSION_DENIED?



我按照下面的指南设置firebase模拟器来测试我的实时数据库安全规则:https://firebase.google.com/docs/emulator-suite/connect_rtdb#clear_your_database_between_tests

对于"在测试之间清理数据库",建议这样做:

firebase.database().ref().set(null);

但是,我的安全规则阻止我的应用程序这样做。

下面是我的代码:


import * as firebase from '@firebase/testing';
import fs from 'fs';
const app = firebase.initializeTestApp({
databaseName: 'myDb',
auth: {
uid: 'myuid',
},
});
describe('test', () => {
beforeEach(async () => {
await firebase.loadDatabaseRules({
databaseName: 'mydb',
rules: fs.readFileSync('database.rules.json', 'utf8'),
});

await app.database().ref().set(null) // This line throws a permission denied error
});
afterAll(async () => {
await Promise.all(firebase.apps().map((app) => app.delete()));
});
it('test', async (done) => {
// ... //
});
}

如何在两次测试之间重置数据库?

找到解决方法了

我需要使用

firebase.initializeAdminApp({ databaseName: "myDb" });

创建一个被认证为管理员的应用。然后我可以在每次测试之间重置数据库:

const app = firebase.initializeTestApp({
databaseName: 'myDb',
auth: {
uid: 'myuid',
},
});
const adminApp = firebase.initializeAdminApp({ databaseName: "myDb" });
let backup;
beforeEach(async () => {
await firebase.loadDatabaseRules({
databaseName: 'myDb',
rules: fs.readFileSync('database.rules.json', 'utf8'),
});
await adminApp
.database()
.ref('/')
.once('value')
.then((v) => {
backup = v.val();
})
});
afterEach(async ()=>{
await adminApp.database().ref('/').set(backup);
})

相关内容

最新更新