【问题标题】:Setting Firestore Emulator with Flutter test hangs使用 Flutter 测试设置 Firestore 模拟器挂起
【发布时间】:2020-06-19 07:25:13
【问题描述】:

我正在尝试使用 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() 方法上,这让我怀疑我这样做的方式是否正确。

【问题讨论】:

  • 实际上小部件测试会模拟并阻止任何网络调用,无论是本地主机还是服务器。如果您必须根据 Firestore 结果测试小部件,请尝试模拟课程。否则,只是尝试使用。来自package:testtest 方法用于单元测试。
  • 谢谢您提供这些信息。我不知道小部件测试阻止了任何网络访问。

标签: firebase flutter google-cloud-firestore firebase-cli flutter-test


【解决方案1】:

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

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

我建议你看看Mockitoprovider 包。

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

【讨论】:

  • 嗨!谢谢您的回答。我知道依赖注入并计划使用Cloud Firestore Mocks。这段代码只是最简单的重现问题的代码,去掉与问题无关的东西,尝试探索Firestore模拟器的使用。无论如何,我不知道小部件测试会阻止任何网络使用并且会坚持模拟
  • 没关系,但你不应该编辑人们的答案添加信息,听起来好像他们说过,应该是评论。看起来我是在推荐这个包,但我自己从来没有使用过,所以我不能推荐给任何人。
  • 当然!让我纠正一下。
猜你喜欢
  • 2019-10-09
  • 2019-08-13
  • 2020-11-07
  • 2021-09-17
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2021-06-10
相关资源
最近更新 更多