Flutter - Как объединить методы тестирования с помощью Firebase Cloud Firestore? - PullRequest
0 голосов
/ 11 сентября 2018

Я новый разработчик и прошу прощения, если это глупый вопрос.

Я пытаюсь использовать Cloud Firestore на Flutter.До сих пор я был в состоянии использовать это, но я хочу включить модульные тесты для функций, которые используют firestore, в моем проекте.Я использую Mockito, чтобы сделать то же самое, и я думаю, что это должно работать.

Но я действительно в тупике от StreamMatchers of Dart.Я не могу обернуть голову вокруг сообщения об ошибке.

Ниже приведен некоторый код того, чего я пытаюсь достичь, и ошибки, которую я получаю.

repository.dart

import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:sunapsis_conference18/models/conference_event.dart';

Stream<List<ConferenceEvent>> getAllEvents() {
    return _firestore
        .collection(_collectionName)
        .snapshots()
        .map((QuerySnapshot snapshot) => _eventMapper(snapshot));
}


List<ConferenceEvent> _eventMapper(QuerySnapshot snapshot) {
    List<ConferenceEvent> events = [];
    for (int i = 0; i < snapshot.documents.length; i++) {
      DocumentSnapshot documentSnapshot = snapshot.documents[i];
      ConferenceEvent event =
          ConferenceEvent.buildFromMap(documentSnapshot.data);
      events.add(event);
    }
    return events;
}

Этот метод пытается получить данные из коллекции пожарного хранилища и вернуть поток списка объектов данных.

repository_test.dart import 'dart:async ';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:mockito/mockito.dart';
import 'package:sunapsis_conference18/models/conference_event.dart';
import 'package:sunapsis_conference18/repository/repository.dart;
import 'package:test/test.dart';

class MockDocumentReference extends Mock implements DocumentReference {}

class MockFirestore extends Mock implements Firestore {}

class MockCollectionReference extends Mock implements CollectionReference {}

class MockQuerySnapshot extends Mock implements QuerySnapshot {}

class MockDocumentSnapshot extends Mock implements DocumentSnapshot {}

class MockQuery extends Mock implements Query {}

main() {
  group('getAllEvents() tests', () {
    final Firestore mockFirestore = MockFirestore();
    final CollectionReference mockCollectionReference =
        MockCollectionReference();
    final QuerySnapshot mockQuerySnapshot = MockQuerySnapshot();
    final DocumentSnapshot mockDocumentSnapshot = MockDocumentSnapshot();
    final Repository repository = Repository(mockFirestore);
    final DocumentReference _mockDocumentRef = MockDocumentReference();
    final Map<String, dynamic> _responseMap = {
      'foo': 123,
      'bar': 'Test title',
    };
    final ConferenceEvent _event = ConferenceEvent.buildFromMap(_responseMap);

    test('returns correct stream of list of ConferenceEvent', () async {
      when(mockFirestore.collection('events'))
          .thenReturn(mockCollectionReference);
      when(mockCollectionReference.snapshots())
          .thenAnswer((_) => Stream.fromIterable([mockQuerySnapshot]));

      when(mockQuerySnapshot.documents).thenReturn([mockDocumentSnapshot]);
      when(mockDocumentSnapshot.data).thenReturn(_responseMap);
      await expectLater(
          repository.getAllEvents(),
          emitsAnyOf([
            [_event],
            emitsDone
          ]));
    });
  });
}

Я не могу сформулировать правильное сопоставление потоков и в то же время не могу понять сообщение об ошибке.

error

Expected: should do one of the following:
          • emit an event that [Instance of 'ConferenceEvent']
          • be done
  Actual: <Instance of '_MapStream<QuerySnapshot, List<ConferenceEvent>>'>
   Which: emitted • [Instance of 'ConferenceEvent']
                  x Stream closed.
            which failed all options:
                  • failed to emit an event that [Instance of 'ConferenceEvent'] because it emitted an event that was <Instance of 'ConferenceEvent'> instead of <Instance of 'ConferenceEvent'> at location [0]
                  • failed to be done

Будем очень благодарны за любые рекомендации, которые помогут понять сообщение об ошибке.Кроме того, это правильный подход для проверки этой функции?

1 Ответ

0 голосов
/ 08 июля 2019

Я думаю, что проблема связана с тем, как waitLater сравнивает экземпляры ConferenceEvent.Для сравнения этих двух объектов используется оператор == (равно), и без перезаписи оператора равенства в вашем ConferenceEvent эти объекты не будут иметь одинаковый hashCode .

В вашем смоделированном коде есть новый объект, созданный здесь

ConferenceEvent event =
          ConferenceEvent.buildFromMap(documentSnapshot.data);

И позже вы сравните его с другим объектом ConferenceEvent, созданным в этой строке:

final ConferenceEvent _event = ConferenceEvent.buildFromMap(_responseMap);
...