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

Using Firebase DB Emulators, how to clear database between tests and avoid PERMISSION_DENIED?

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

在“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) => {
    // ... //
  });
}

如何在测试之间重置我的数据库?

找到解决方案here

我需要使用

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);
  })