Flutter - Как объединить методы тестирования с помощью Firebase Cloud Firestore?
Я новый разработчик, и я прошу прощения, если это глупый вопрос.
Я пытаюсь использовать Cloud Firestore на Flutter. До сих пор я был в состоянии использовать это, но я хочу включить модульные тесты для функций, которые используют firestore, в моем проекте. Я использую Mockito, чтобы сделать то же самое, и я думаю, что это должно работать.
Но я действительно озадачен StreamMatchers 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;
}
Этот метод пытается получить данные из коллекции Firestore и вернуть поток списка объектов данных.
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
]));
});
});
}
Я не могу сформулировать правильное сопоставление потоков и в то же время не могу понять сообщение об ошибке.
ошибка
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
Любые рекомендации, которые помогут понять сообщение об ошибке, будут по достоинству оценены. Кроме того, это правильный подход для проверки этой функции?
0 ответов
Я думаю, что проблема связана с тем, как expectLater сравнивает экземплярыConferenceEvent
. Он использует оператор == (равно) для сравнения этих двух объектов и без перезаписи оператора равенства в вашемConferenceEvent
эти объекты не будут иметь одинаковый хэш-код.
В издеваемом коде здесь создан экземпляр нового объекта.
ConferenceEvent event =
ConferenceEvent.buildFromMap(documentSnapshot.data);
А потом сравниваешь с другим объектом ConferenceEvent
создано в этой строке:
final ConferenceEvent _event = ConferenceEvent.buildFromMap(_responseMap);