首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集成测试中如何重置防火墙仿真器

集成测试中如何重置防火墙仿真器
EN

Stack Overflow用户
提问于 2020-12-18 10:31:18
回答 1查看 1.4K关注 0票数 7

我正在运行我的集成测试,在颤振和飞镖使用的防火墙模拟器。首先,我用如下所示的数据启动了防火墙模拟器:firebase emulators:start --import=./dir.

然后启动一个android仿真器,并启动我想在android模拟器上测试的应用程序。该应用程序被配置为使用防火墙仿真器。然后,我运行一系列测试,这些测试都是写到防火墙仿真器上的。

但是在每个测试开始时,我希望在我第一次启动模拟器时将数据重置为状态。因此,例如,如果按照这样的顺序执行测试:

测试A测试B测试C

我不希望在执行测试B和C时,创建测试A以显示在数据库中的数据。我可以终止防火墙仿真器,并在每次测试开始时再次启动它。但这会让我的测试慢很多。

您是否知道一种重置数据的方法,它存在于firebase模拟器中?

EN

回答 1

Stack Overflow用户

发布于 2021-12-16 18:35:33

当你说要“重置数据”时,我假设你指的是消防站。

根据https://firebase.google.com/docs/emulator-suite/install_and_configure#use_the_emulator_hub_rest_api的文档

代码语言:javascript
复制
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中的clearDb调用可以满足您的需要。

在清除或填充数据库之前,重要的是禁用触发器,以防您有防火墙触发器以测试不期望的方式修改数据。我通过将完整的DB状态传递给populateDb方法来编写测试,然后在运行测试之前重新启用触发器,以便测试所述触发器。如果您没有运行任何防火墙触发器,那么仅使用clearDb调用就足以满足您的需要。

我的测试在beforeEach钩子中都有对beforeEach()的调用,以确保每个测试都干净地运行。我建议将它添加到您最喜欢的测试API公开的任何类似“beforeEach”的钩子中。

如果您的测试做了诸如在Firebase身份验证中创建用户之类的事情,那么您将不得不在测试运行期间找到另一种方法来清除它们。

如果有人可以找到关于如何清除Firebase仿真程序套件中的其他模拟器的文档,请将其放在注释中。我目前正试图找到一种清除身份验证模拟器的方法,这实际上就是我如何发现这个问题的。

祝你好运!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65355410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档