当您说要“重置数据”时,我假设您指的是 Firestore。
根据https://firebase.google.com/docs/emulator-suite/install_and_configure#use_the_emulator_hub_rest_api 的文档
import fetch from 'node-fetch';
import firebaseConfig from '../../../firebase.json';
const hubEmulatorPort = firebaseConfig.emulators.hub.port;
const firestoreEmulatorPort = firebaseConfig.emulators.firestore.port;
async function clearDb() {
const response = await fetch(
`http://localhost:${firestoreEmulatorPort}/emulator/v1/projects/${process.env.PROJECT_ID}/databases/(default)/documents`,
{
method: 'DELETE',
}
);
if (response.status !== 200) {
throw new Error('Trouble clearing Emulator: ' + (await response.text()));
}
}
async function populateDb(data) {
// Logic for adding in any data you want in the db
// before each test run
}
async function enableBackgroundTriggers() {
const response = await fetch(`http://localhost:${hubEmulatorPort}/functions/enableBackgroundTriggers`, {
method: 'PUT',
});
if (response.status !== 200) {
throw new Error('Trouble enabling database triggers in emulator: ' + (await response.text()));
}
}
async function disableBackgroundTriggers() {
const response = await fetch(`http://localhost:${hubEmulatorPort}/functions/disableBackgroundTriggers`, {
method: 'PUT',
});
if (response.status !== 200) {
throw new Error('Trouble disabling database triggers in emulator: ' + (await response.text()));
}
}
async function resetDb(data) {
await disableBackgroundTriggers();
await clearDb();
await populateDb(data);
await enableBackgroundTriggers();
}
export { resetDb };
我找不到清除数据库的来源,但 clearDb 中的 RESTful 调用可以满足您的需求。
在清除或填充数据库之前禁用触发器很重要,以防您的 firestore 触发器以您的测试不期望的方式修改数据。我通过将完整的 DB 状态传递给 populateDb 方法来编写测试,然后在运行测试之前重新启用触发器,以便我可以测试所述触发器。如果您没有运行任何 Firestore 触发器,那么仅 clearDb 调用就足以满足您的目的。
我的测试都在我的 beforeEach 挂钩中开玩笑地调用了 resetDb(),以确保每个测试的干净运行。我建议将此添加到您最喜欢的测试 API 公开的任何类似“beforeEach”的钩子中。
如果您的测试执行诸如在 Firebase 身份验证中创建用户之类的操作,则您必须找到另一种方法在测试运行之间清除它们。
如果有人可以找到有关如何清除 Firebase Emulator Suite 中其他模拟器的文档,请将其放入 cmets。我目前正在尝试找到一种清除身份验证模拟器的方法,这实际上就是我发现这个问题的方式。
祝你好运!