使用Firebase模拟器在XCode中测试Firestore时如何设置测试数据?

时间:2020-04-27 16:17:08

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

几天来我一直在尝试使用测试数据设置Firebase Emulator。

我做了什么?

  • 我已经成功部署了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是否唯一(意味着数据库中已经存在)。我该怎么办?

2 个答案:

答案 0 :(得分:2)

Firestore模拟器现在支持导入/导出。因此,创建一个测试用例:

  1. 运行模拟器(import socketIOClient from 'socket.io-client'; import MockedSocket from 'socket.io-mock'; jest.mock('socket.io-client'); describe('Testing connection', () => { let socket; beforeEach(() => { socket = new MockedSocket(); socketIOClient.mockReturnValue(socket); }); afterEach(() => { jest.restoreAllMocks(); }); it('should dispatch connect event', () => { /*socket should connect in App and Note that the url should be dummy string for test environment e.g.(const socket = io('', options);)*/ const wrapper = ( <Provider store={store}> <App /> </Provider> ); expect(socketIOClient.connect).toHaveBeenCalled(); }); it('should emit message:new', done => { const wrapper = ( <Provider store={store}> <App /> </Provider> ); ... socket.on('message:new', (data)=>{ expect(data).toEqual(['message1', 'message2']); done(); }); socket.socketClient.emit('message:new', ['message1', 'message2']); ... }); });
  2. 连接您的应用程序或脚本并创建所需的测试数据
  3. 在另一个终端窗口中,运行firebase emulators:start

现在,您将在firebase emulators:export ./some-directory中拥有Firestore模拟器数据的快照。您可以通过运行以下命令以这些数据启动仿真器:

./some-directory

目前,此功能仅支持Firestore,但我们希望将来可以使用相同的流程将导入/导出添加到更多仿真器中。

答案 1 :(得分:1)

现在将数据放入仿真器的常用方法是运行代码,以便在启动时从应用程序代码中注入数据。

正在研究一种在启动时将数据作为仿真器的命令行选项注入的方法,但是像往常一样:我们不能做出任何承诺,也不能给出时间表。在此之前,通常必须在测试设置中从代码中插入测试数据。