実現したいこと
カバレッジを満たすためのテストコードを実装したい。(file_picker_service.dart)
発生している問題・分からないこと
file_picker_service.dart内のクラスや関数に対して、カバレッジを満たすためのテストコードの実装方法がわからない。
該当のソースコード
Flutter(main.dart)
1class MyApp extends StatelessWidget { 2 const MyApp({super.key}); 3 4 @override 5 Widget build(BuildContext context) { 6 return MaterialApp( 7 debugShowCheckedModeBanner: false, 8 title: 'Flutter Demo', 9 theme: ThemeData( 10 colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), 11 useMaterial3: true, 12 ), 13 home: MyHomePage( 14 title: 'Flutter Demo Home Page', 15 filePickerService: FilePickerServiceImpl(), 16 ), 17 ); 18 } 19} 20 21class MyHomePage extends StatefulWidget { 22 const MyHomePage({ 23 super.key, 24 required this.title, 25 required this.filePickerService, 26 }); 27 28 final String title; 29 final FilePickerService filePickerService; 30 31 @override 32 State<MyHomePage> createState() => MyHomePageState(); 33} 34 35class MyHomePageState extends State<MyHomePage> { 36 String jsonFilePath = 'Selected JSON File Path'; 37 String csvFilePath = 'Selected CSV File Path'; 38 39 @override 40 Widget build(BuildContext context) { 41 return Scaffold( 42 appBar: AppBar( 43 backgroundColor: Theme.of(context).colorScheme.inversePrimary, 44 title: Text(widget.title), 45 ), 46 body: Center( 47 child: Column( 48 mainAxisAlignment: MainAxisAlignment.center, 49 children: [ 50 OutlinedButton( 51 onPressed: () async { 52 FilePickerResult? result; 53 try { 54 result = await widget.filePickerService.pickFiles( 55 type: FileType.custom, 56 allowedExtensions: ['json'], 57 ); 58 59 debugPrint('selected file'); 60 } on Exception catch (e) { 61 debugPrint('onPressed in Exception: $e'); 62 } 63 64 if (result != null) { 65 debugPrint('result is not null'); 66 setState(() { 67 jsonFilePath = result!.files.single.path ?? ''; 68 debugPrint('jsonFilePath: $jsonFilePath'); 69 debugPrint('file size: ${result.files.single.size}'); 70 }); 71 } else { 72 debugPrint('result is null'); 73 } 74 }, 75 child: const Text('Import JSON'), 76 ), 77 const SizedBox(height: 30), 78 Text(jsonFilePath), 79 const SizedBox(height: 30), 80 OutlinedButton( 81 onPressed: () async { 82 FilePickerResult? result; 83 try { 84 result = await widget.filePickerService.pickFiles( 85 type: FileType.custom, 86 allowedExtensions: ['csv'], 87 ); 88 89 debugPrint('selected file'); 90 } on Exception catch (e) { 91 debugPrint('onPressed in Exception: $e'); 92 } 93 94 if (result != null) { 95 debugPrint('result is not null'); 96 setState(() { 97 csvFilePath = result!.files.single.path ?? ''; 98 debugPrint('csvfilePath: $csvFilePath'); 99 debugPrint('file size: ${result.files.single.size}'); 100 }); 101 } else { 102 debugPrint('result is null'); 103 } 104 }, 105 child: const Text('Import CSV'), 106 ), 107 const SizedBox(height: 30), 108 Text(csvFilePath), 109 ], 110 ), 111 ), 112 ); 113 } 114}
Flutter(file_picker_service.dart)
1import 'package:file_picker/file_picker.dart'; 2import 'package:flutter/material.dart'; 3 4abstract class FilePickerService { 5 Future<FilePickerResult?> pickFiles({ 6 required FileType type, 7 List<String>? allowedExtensions, 8 }); 9} 10 11class FilePickerServiceImpl implements FilePickerService { 12 @override 13 Future<FilePickerResult?> pickFiles({ 14 required FileType type, 15 List<String>? allowedExtensions, 16 }) async { 17 debugPrint('filePicker'); 18 return await FilePicker.platform.pickFiles( 19 type: type, 20 allowedExtensions: allowedExtensions, 21 ); 22 } 23} 24
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
mocktail等を用いて実施してみても上手くいかなかった。FilePickerServiceImplを直接テストコード側で参照するよう実装しないとダメそうだったが、FilePickerの静的メンバーのplatformの初期化遅延のエラー(LateInitializationError )が発生してしまう。
file_picker_service.dart内のカバレッジを満たすためのテストコードを教えてほしいです。
補足
特になし
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。