如何使用Firebase Cloud Firestore进行单元测试方法?
我正在尝试在Flitter上使用CloudFireStore。到目前为止,我已经能够使用它,但我想在我的项目中包括使用firestore的函数的单元测试。我正在利用Mockito做同样的事情,我认为它应该会起作用 但我真的被Dart的流线型匹配器难住了。我无法理解错误消息 下面是一些我试图实现的代码和我得到的错误 存储库.dart如何使用Firebase Cloud Firestore进行单元测试方法?,firebase,dart,flutter,google-cloud-firestore,flutter-test,Firebase,Dart,Flutter,Google Cloud Firestore,Flutter Test,我正在尝试在Flitter上使用CloudFireStore。到目前为止,我已经能够使用它,但我想在我的项目中包括使用firestore的函数的单元测试。我正在利用Mockito做同样的事情,我认为它应该会起作用 但我真的被Dart的流线型匹配器难住了。我无法理解错误消息 下面是一些我试图实现的代码和我得到的错误 存储库.dart 导入'dart:async'; 导入“包:cloud_firestore/cloud_firestore.dart”; 导入“包:sunapsis_conferenc
导入'dart:async';
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:sunapsis_conference18/models/conference_event.dart”;
流getAllEvents(){
返回火场
.collection(_collectionName)
.快照()
.map((QuerySnapshot快照)=>\u事件映射器(快照));
}
列表\u事件映射器(QuerySnapshot快照){
列出事件=[];
对于(int i=0;i
它试图从firestore集合中获取数据,并返回数据对象列表流
存储库\u测试。dart
导入'dart:async';
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“package:mockito/mockito.dart”;
导入“包:sunapsis_conference18/models/conference_event.dart”;
导入“package:sunapsis_conference18/repository/repository.dart”//引号修复
导入“包:test/test.dart”;
类MockDocumentReference扩展了Mock实现DocumentReference{}
类MockFirestore扩展了Mock实现Firestore{}
类MockCollectionReference扩展了Mock实现CollectionReference{}
类MockQuerySnapshot扩展了Mock实现QuerySnapshot{}
类MockDocumentSnapshot扩展了Mock实现DocumentSnapshot{}
类MockQuery扩展Mock实现查询{}
main(){
组('getAllEvents()测试',(){
最终Firestore mockFirestore=mockFirestore();
最终收集参考mockCollectionReference=
MockCollectionReference();
最终QuerySnapshot mockQuerySnapshot=mockQuerySnapshot();
final DocumentSnapshot mockDocumentSnapshot=mockDocumentSnapshot();
最终存储库=存储库(mockFirestore);
最终文档参考_mockDocumentRef=MockDocumentReference();
最终映射_响应映射={
“福”:123,
“栏”:“测试标题”,
};
最终ConferenceEvent _event=ConferenceEvent.buildFromMap(_responseMap);
test('返回ConferenceEvent列表的正确流',()异步{
何时(mockFirestore.collection('events'))
.然后返回(mockCollectionReference);
何时(mockCollectionReference.snapshots())
.thenAnswer(()=>Stream.fromIterable([mockQuerySnapshot]);
when(mockQuerySnapshot.documents)。然后返回([mockDocumentSnapshot]);
when(mockDocumentSnapshot.data)。然后返回(\u responseMap);
待会儿(
repository.getAllEvents(),
埃米特桑约夫([
[u事件],
发射体
]));
});
});
}
我无法制定正确的流匹配器,同时也无法理解错误消息
错误
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
预期:应执行以下操作之一:
•发出[ConferenceEvent'实例]的事件
•完成
实际:
其中:发出•[ConferenceEvent'实例]
x流关闭。
所有选项均失败:
•未能发出[ConferenceEvent'实例]发生的事件,因为它发出的事件不是在位置[0]发生的
•未能完成
任何有助于理解错误信息的指导都将不胜感激。另外,这是测试此功能的正确方法吗?我认为问题与比较
ConferenceEvent
实例的方式有关。它使用(equal)操作符来比较这两个对象,并且在不覆盖ConferenceEvent
中的equal操作符的情况下,这些对象将不会具有相同的属性
在模拟代码中,这里实例化了一个新对象
ConferenceEvent event =
ConferenceEvent.buildFromMap(documentSnapshot.data);
然后将其与此行中创建的另一个ConferenceEvent
对象进行比较:
final ConferenceEvent _event = ConferenceEvent.buildFromMap(_responseMap);
你能从测试文件的顶部添加导入吗?@GünterZöchbauer,我已经添加了导入。读了你的评论后,我认为这是一个导入问题,并尝试再次添加导入,但没有解决。非常感谢你调查这件事。看起来不错。不知道是什么原因造成的。现在我很担心,因为我很确定你能帮上忙
未能发出一个事件,[ConferenceEvent'的实例],因为它发出的事件不是在位置[0]处发出的。
这没有多大意义,尤其是位置[0]
部分。下面是一个如何对Cloud Firestore dart代码进行单元测试的示例,这可能会有所帮助:我遇到了类似的问题,此解决方案也有效。我只需要重写==运算符和哈希代码。