【问题标题】:How to setup test data when testing Firestore in XCode with Firebase Emulator?使用 Firebase Emulator 在 XCode 中测试 Firestore 时如何设置测试数据?
【发布时间】:2020-04-27 16:17:08
【问题描述】:

几天来,我一直在尝试使用测试数据设置 Firebase 模拟器。

我做了什么?

  • 我已成功部署 Firebase 模拟器
  • 我编写了一个测试来检查模拟 Firestore 中的值,并且测试也通过了。
func test_WhenPartyNameIsUnique_ThenErrorIsNil() {
   // given
   let exp = self.expectation(description: "Waiting for Firebase Emulator")

   // when
   self.sut.isUnique(partyName: "akshit") { (error) in
     // then
     XCTAssertNil(error)
     exp.fulfill()
   }

   self.waitForExpectations(timeout: 1, handler: nil)
}

有什么问题?

我无法弄清楚如何为每个测试设置不同的测试数据。对于上述测试,我想检查partyName 是否不是唯一的(意味着数据库中已经存在)。我该怎么做?

【问题讨论】:

  • 我不确定我的理解是否正确,但现在将数据导入模拟器的常用方法是运行代码以在启动时从应用程序代码中注入该数据。正在研究一种在启动时将数据作为命令行选项注入模拟器的方法,但像往常一样:我们不能做出任何承诺,也不能给出时间表。在此之前,它必须来自您的代码。
  • 嗨,@FrankvanPuffelen 我想用一些初始数据设置 Firestore,仅用于特定的单元测试。我希望这现在很清楚。
  • 在这种情况下:现在将数据导入模拟器的常用方法是运行代码以在启动时从应用程序代码中注入该数据。

标签: ios swift firebase google-cloud-firestore firebase-tools


【解决方案1】:

Firestore 模拟器现在支持导入/导出。所以要创建一个测试用例:

  1. 运行模拟器 (firebase emulators:start)
  2. 连接您的应用或脚本并创建您想要的测试数据
  3. 在另一个终端窗口中运行firebase emulators:export ./some-directory

现在您将在 ./some-directory 中获得 Firestore 模拟器数据的快照。您可以通过运行以下数据来启动模拟器:

firebase emulators:start --import=./some-directory

目前仅支持 Firestore,但我们希望将来使用相同的流程将导入/导出添加到更多模拟器。

【讨论】:

  • 有没有办法像上面一样从生产firestore导出数据并导入模拟器?
  • 如何在单元测试环境中访问导入的数据?也就是说,当使用@firebase/testing 时,我们通常会像这样创建测试应用程序:const db = firebase.initializeTestApp({ projectId: PROJECT_ID, auth }).firestore(); - 如何访问通过模拟器导入的数据并将其输入到这个数据库实例中?
【解决方案2】:

目前将数据导入模拟器的常用方法是运行代码以在启动时从应用程序代码中注入该数据。

目前正在努力将启动时的数据作为命令行选项注入模拟器,但与往常一样:我们不能做出任何承诺,也不能给出时间表。但在此之前,测试数据通常必须在测试设置中从您的代码中插入。

【讨论】:

  • 好的。但是,我们可以为不同的单元测试设置不同的 Firestore 状态吗?我不想在开始时注入单个数据库然后对其进行操作。它不适用于所有测试用例。
  • 大多数单元测试框架都有为相关测试方法运行专用设置方法的方法。我不是 iOS 专家,但这听起来与我使用过的其他测试框架非常相似:developer.apple.com/documentation/xctest/xctestcase/…。有了这个,您将需要选择是为每个状态运行单独的模拟器运行,还是在一次运行中运行它们。我会选择后者,但在这种情况下,您需要确保每个州的测试数据是隔离的(例如,放入集合中)。
  • 我也会选择后者,使用单个模拟器实例运行所有测试。我也知道设置和拆卸功能。我不确定如何将数据从测试目标插入 Firebase。但是,根据您的 cmets,我必须更改生产代码才能插入一些测试数据,然后从测试目标中调用这些函数。
  • 查看我上面的回答,了解如何从文件导入/导出。
  • Sam 的回答显示了如何在启动时导入数据:stackoverflow.com/a/61501928
猜你喜欢
  • 2019-10-09
  • 2019-10-07
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多