Flutter中如何对Future<void>类型的addRating函数进行单元测试?
Flutter Firestore addRating函数单元测试指导
问题描述
我有一个名为addRating的Future<void>函数,用于向Firestore添加数据,刚接触Flutter测试,不知道怎么对这个函数做单元测试。
待测试函数
Future<void> addRating(RatingModel rating) async { await _firestore.collection('rating').doc(rating.ratingId).set(rating.toJson()); }
我尝试的测试代码
final firestore = FakeFirebaseFirestore(); test('can add to firestore', () async{ RatingRepository ratingRepository = RatingRepository(firestore: firestore); RatingModel model = RatingModel(feedback: 'test', merchantId: '1', orderId: '1', rating: 1, ratingId: '1'); await expectLater(()async{await ratingRepository.addRating(model);}, isNull); });
正确的单元测试方案
你用FakeFirebaseFirestore模拟真实Firestore的思路没问题,但当前的断言逻辑完全无效——Future<void>本身就会返回null,断言这个根本验证不了数据是否真的写入了。正确的做法是去模拟Firestore里读取数据,验证写入的内容是否符合预期。
完整测试代码
import 'package:fake_cloud_firestore/fake_cloud_firestore.dart'; import 'package:test/test.dart'; void main() { test('addRating 能成功将评分数据写入Firestore', () async { // 初始化模拟Firestore和仓库实例 final fakeFirestore = FakeFirebaseFirestore(); final ratingRepo = RatingRepository(firestore: fakeFirestore); // 创建测试用的评分模型 final testRating = RatingModel( feedback: 'test', merchantId: '1', orderId: '1', rating: 1, ratingId: '1', ); // 调用待测试的添加方法 await ratingRepo.addRating(testRating); // 从模拟Firestore中读取对应的文档 final docSnapshot = await fakeFirestore .collection('rating') .doc(testRating.ratingId) .get(); // 验证文档存在且数据匹配 expect(docSnapshot.exists, isTrue); expect(docSnapshot.data(), equals(testRating.toJson())); }); }
关键要点
- 核心逻辑是写后读验证:调用方法后必须从模拟库中读取数据,才能确认函数真的完成了写入操作
- 确保
RatingModel.toJson()能正确将模型转为Firestore支持的Map结构,这是测试通过的基础 - 如果
addRating有异常处理(比如捕获Firestore错误),还需要补充异常场景测试:比如传入重复的ratingId、无效字段时,函数是否按预期处理异常
内容的提问来源于stack exchange,提问作者Parama Artha
相关产品推荐
相关产品推荐

