gpt4 book ai didi

firebase - Flutter 单元测试 Firestore

转载 作者:行者123 更新时间:2023-12-05 00:51:44 26 4
gpt4 key购买 nike

总的来说,我是单元测试的新手。我正在尝试从我的 DataRepository 测试简单的方法。

点击此链接但似乎已弃用:https://utkarshkore.medium.com/writing-unit-tests-in-flutter-with-firebase-firestore-72f99be85737

class DataRepository {
final CollectionReference collection =
FirebaseFirestore.instance.collection('notes');

//Retour de models a la place de snapshots
Stream<QuerySnapshot> getStream() {
return collection.snapshots();
}

Stream<QuerySnapshot> getStreamDetail(String id) {
return collection.doc(id).collection('tasks').snapshots();
}

Stream<List<Note>> noteStream() {
final CollectionReference collection =
FirebaseFirestore.instance.collection('notes');

try {
return collection.snapshots().map((notes) {
final List<Note> notesFromFirestore = <Note>[];
for (var doc in notes.docs) {
notesFromFirestore.add(Note.fromSnapshot(doc));
}
return notesFromFirestore;
});
} catch (e) {
rethrow;
}
}

到目前为止,这是我的测试文件的样子:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';

class MockFirestore extends Mock implements FirebaseFirestore {}
class MockCollectionReference extends Mock implements CollectionReference {}

void main() {
MockFirestore instance = MockFirestore();
MockCollectionReference mockCollectionReference = MockCollectionReference();

test('should return data when the call to remote source is succesful.',
() async {
when(instance.collection('notes')).thenReturn(mockCollectionReference);
});
}

第一个实例抛出这个错误

The argument type 'MockCollectionReference' can't be assigned to the parameter type 'CollectionReference<Map<String, dynamic>>'

非常感谢测试该方法的帮助。

新编辑:

void main() {
test('should return data when the call to remote source is succesful.',
() async {
final FakeFirebaseFirestore fakeFirebaseFirestore = FakeFirebaseFirestore();
final DataRepository dataRepository = DataRepository();
final CollectionReference mockCollectionReference =
fakeFirebaseFirestore.collection(dataRepository.collection.path);

final List<Note> mockNoteList = <Note>[];

for (Note mockNote in mockNoteList) {
await mockCollectionReference.add(mockNote.toJson());
}

final Stream<List<Note>> noteStreamFromRepository =
dataRepository.noteStream();

final List<Note> actualNoteList = await noteStreamFromRepository.first;
final List<Note> expectedNoteList = mockNoteList;

expect(actualNoteList, expectedNoteList);
});
}

最佳答案

您可以使用 fake_cloud_firestore使用 FakeCloudFirestore 模拟 Firestore 实例可用于代替实际 FirebaseFirestore 的对象对象。

一个例子:

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:fake_cloud_firestore/fake_cloud_firestore.dart';

test('noteStream returns Stream containing List of Note objects', () async {
//Define parameters and objects

final FakeFirebaseFirestore fakeFirebaseFirestore = FakeFirebaseFirestore();

final DataRepository dataRepository =
DataRepository(firestore: fakeFirebaseFirestore);

final CollectionReference mockCollectionReference =
fakeFirebaseFirestore.collection(dataRepository.collection.path);

final List<Note> mockNoteList = [Note()];

// Add data to mock Firestore collection
for (Note mockNote in mockNoteList) {
await mockCollectionReference.add(mockNote.toSnapshot());
}

// Get data from DataRepository's noteStream i.e the method being tested
final Stream<List<Note>> noteStreamFromRepository =
dataRepository.noteStream();

final List<Note> actualNoteList = await noteStreamFromRepository.first;

final List<Note> expectedNoteList = mockNoteList;

// Assert that the actual data matches the expected data
expect(actualNoteList, expectedNoteList);
});

解释:

上面的测试对您的代码做了以下假设:

  • 您通过 FirebaseFirestore对象进入 DataRepository对象。
  • 您有一个 toSnapshot您的 Note 上的方法转换您的 Note 的对象对象变成 Map<String, dynamic>对象。

测试按以下方式进行:

  1. 它创建测试所需的必要对象,即 FakeFirebaseFirestore对象,DataRepository对象,模拟 CollectionReference对象和要传递到模拟集合引用 (mockNoteList) 的模拟数据。
  2. 它将数据添加到模拟集合引用中。
  3. 它使用 DataRepository 获取数据的noteStream方法。
  4. 它断言来自 DataRepository 的实际数据等于预期数据,即最初传递给模拟集合引用的数据。

资源:

如需进一步了解 Flutter 中的单元测试 Firestore,请查看以下资源:

更新

将 FirebaseFirestore 对象添加为您的构造函数参数之一,并使用它来代替 FirebaseFirestore.instance .

更新您的DataRepository到下面这个:

class DataRepository {
DataRepository({required this.firestore});

final FirebaseFirestore firestore;

CollectionReference get collection =>
firestore.collection('notes');

//Retour de models a la place de snapshots
Stream<QuerySnapshot> getStream() {
return collection.snapshots();
}

Stream<QuerySnapshot> getStreamDetail(String id) {
return collection.doc(id).collection('tasks').snapshots();
}

Stream<List<Note>> noteStream() {
try {
return collection.snapshots().map((notes) {
final List<Note> notesFromFirestore = <Note>[];
for (var doc in notes.docs) {
notesFromFirestore.add(Note.fromSnapshot(doc));
}
return notesFromFirestore;
});
} catch (e) {
rethrow;
}
}

更新的 DataRepository 使用:

  • 在测试中:
 final FakeFirebaseFirestore fakeFirebaseFirestore = FakeFirebaseFirestore();
final DataRepository dataRepository =
DataRepository(firestore: fakeFirebaseFirestore);
  • 在应用中:
 final FirebaseFirestore firebaseFirestore = FirebaseFirestore.instance;
final DataRepository dataRepository =
DataRepository(firestore: firebaseFirestore);

关于firebase - Flutter 单元测试 Firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71370219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com