如何在Flutter端对Supabase Storage进行E2E测试Mock?
在Patrol E2E测试中Mock Supabase Storage的download方法
当然可以只Mock storage.from('...').download 方法,核心思路是通过Mock Supabase客户端调用链中的各个对象,最终拦截download方法并返回预期结果。以下是具体实现步骤:
1. 添加测试依赖
在pubspec.yaml的dev_dependencies中添加Mock工具(推荐使用mocktail,语法更简洁)和Patrol测试依赖:
dev_dependencies: flutter_test: sdk: flutter patrol: ^2.0.0 mocktail: ^1.0.0
2. 创建Mock类
针对Supabase的客户端、存储服务和存储桶创建Mock类,用于拦截方法调用:
import 'package:mocktail/mocktail.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class MockSupabaseClient extends Mock implements SupabaseClient {} class MockStorageClient extends Mock implements StorageClient {} class MockBucket extends Mock implements Bucket {}
3. 编写Patrol测试用例
在测试中构建Mock调用链,替换真实的Supabase实例,并指定download方法的返回值:
import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patrol/patrol.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; // 导入上面创建的Mock类 void main() { patrolTest('验证文档下载功能', ($) async { // 初始化Mock对象 final mockSupabase = MockSupabaseClient(); final mockStorage = MockStorageClient(); final mockGeneralBucket = MockBucket(); // 构建调用链:client.storage → storage.from('general') → bucket.download(...) when(() => mockSupabase.storage).thenReturn(mockStorage); when(() => mockStorage.from('general')).thenReturn(mockGeneralBucket); // Mock download方法,返回预期的文件内容(这里用字符串转Uint8List模拟) final mockPdfContent = Uint8List.fromList('模拟PDF文件内容'.codeUnits); when(() => mockGeneralBucket.download('/trainings/2023-04-17.pdf')) .thenAnswer((_) async => mockPdfContent); // 替换Supabase的全局客户端实例 await Supabase.instance.dispose(); // 先销毁原有实例 Supabase.instance.client = mockSupabase; // 启动应用 await $.pumpWidgetAndSettle(const MyApp()); // 执行测试操作:比如触发下载按钮 await $.tap(find.byKey(const Key('download_training_btn'))); // 验证download方法是否被正确调用 verify(() => mockGeneralBucket.download('/trainings/2023-04-17.pdf')).called(1); // 可添加额外断言:比如验证UI是否展示了下载成功的提示或内容 expect(find.text('下载完成'), findsOneWidget); }); }
关键说明
- 只需要Mock调用链中用到的环节:如果你的代码只用到
storage.from('general').download,那么只需要为这几个方法设置返回逻辑,其他未用到的方法无需额外Mock。 - 全局实例替换:通过
Supabase.instance.client = mockSupabase替换真实客户端,确保应用代码调用的是Mock对象。 - 验证调用:使用
verify可以确认download方法是否按预期被调用,保证测试的准确性。
内容的提问来源于stack exchange,提问作者Bertuz
相关产品推荐
相关产品推荐

