Flutter集成测试mock file_picker出现PlatformException异常如何解决
问题原因
你遇到的报错是因为MethodChannel的Mock回调不能直接返回FilePickerResult自定义类实例,MethodChannel仅支持序列化 Dart 标准数据类型(如Map、List、String、int、bool、null等),返回自定义类实例无法被通道编码,就会触发参数非法错误。
file_picker插件内部会自行将MethodChannel返回的标准Map结构转换为FilePickerResult对象,你只需要按照插件约定的结构返回对应Map即可。
解决方案
修改mockFilePicker方法的返回内容,按照插件预期的结构返回Map:
import 'dart:io'; import 'dart:typed_data'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:path_provider/path_provider.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); setUp(() { mockFilePicker(); }); testWidgets("test", (WidgetTester tester) async { // await app.main(); // .. test case .. }); } mockFilePicker() { const MethodChannel channel = MethodChannel('miguelruivo.flutter.plugins.filepicker'); channel.setMockMethodCallHandler((MethodCall methodCall) async { print("MockMethodChannel run"); // 匹配文件选择调用方法 if (methodCall.method == 'pickFiles') { ByteData data = await rootBundle.load('assets/images/ic_bill.png'); Uint8List bytes = data.buffer.asUint8List(); Directory tempDir = await getTemporaryDirectory(); File file = await File( '${tempDir.path}/image.png', ).writeAsBytes(bytes); // 返回符合file_picker解析规则的Map结构 return { 'files': [ { 'path': file.path, 'name': 'image.png', 'size': file.lengthSync(), 'bytes': bytes, // Web端测试必填,移动端可省略 } ] }; } // 其他方法调用默认返回null即可 return null; }); }
注意事项
- 若需要模拟多选文件场景,在
files数组中添加多个对应文件的Map结构即可 - 若测试涉及不同类型文件的选择,调整
name字段的后缀和对应资源路径即可 - 若测试场景需要模拟用户取消选择的操作,直接返回
null即可,file_picker会返回空结果
内容的提问来源于stack exchange,提问作者ikhwan aja
相关产品推荐
相关产品推荐

