使用 Flutter 测试挂起设置 Firestore 模拟器

Setting Firestore Emulator with Flutter test hangs

我正在尝试使用 Firestore 模拟器编写单元测试。

我已经使用以下命令启动了模拟器:

firebase emulators:start --only firestore

测试如下:

  testWidgets('should retrieve correct item', (tester) async {
    await Firestore.instance.settings(
      host: "127.0.0.1:8080",
      sslEnabled: false,
      persistenceEnabled: false,
    );

    var ref = await Firestore.instance
      .collection('books')
      .add({ 'title': 'title'});

    // Fetch item by id
    var resp = await Firestore.instance
      .collection('books')
      .document(ref.documentID)
      .get();

    expect(resp, isNotNull);

  });

问题是代码挂在 .settings() 方法上,永远不会进行下一步。

有趣的是,当我停止模拟器时,测试的行为相同并挂在 .add() 方法上,让我想知道我这样做的方式是否正确。

你应该看看 Dependency Injection,那不是测试东西的正确方法。测试可能挂起,因为它无法在该地址与 Firebase 通信。

每当您有一段代码难以测试时,无论是因为它很慢还是需要网络访问(API、数据库等),您都应该 mock 它。

我建议你看看 Mockito and provider 包。

使用 Provider 将依赖项(Firebase.instance 在这种情况下)注入到您的实际代码中,并且在测试时您可以注入一个 Firebase 的模拟,它实际上什么都不做,而不是使用 Mockito,并且仍然验证对 Firebase 的所有调用都是正确的.