Настройка эмулятора Firestore с тестовыми зависаниями Flutter - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь написать модульные тесты с использованием эмулятора 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() метод, который заставляет меня задуматься, а правильно ли я это делаю.

1 Ответ

1 голос
/ 17 марта 2020

Вы должны взглянуть на Dependency Injection , это неправильный способ тестирования. Вероятно, тест зависает, так как он не может связаться с Firebase по этому адресу.

Каждый раз, когда у вас есть фрагмент кода, который сложно протестировать, либо потому, что он медленный или требует доступа к сети (API, Databases et c.) вам следует mock it.

Я рекомендую вам взглянуть на пакеты Mockito и Поставщик .

Используйте Provider для внедрения зависимостей (Firebase.instance в этом случае) в ваш реальный код, и при тестировании вы можете внедрить макет Firebase, который на самом деле ничего не делает, вместо этого, используя Mockito, и по-прежнему проверять правильность всех вызовов Firebase.

...