質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

1回答

152閲覧

Flutter:カバレッジを満たすためのテストコードの実現方法がわからない

fuku_f012

総合スコア0

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2024/12/09 13:55

実現したいこと

カバレッジを満たすためのテストコードを実装したい。(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内のカバレッジを満たすためのテストコードを教えてほしいです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

MockクラスにMockPlatformInterfaceMixinをつけて、それをsetUp時にFilePicker.platformに渡すようにしてはどうですか。
FilePicker.platformに代入可能ですが、テスト用はMockPlatformInterfaceMixinをmixinしたクラスにする必要があるようです。

以下はmockitoとbuild_runnerを使った際のmainの先頭部分です。

dart

1class FilePickerMock extends Mock 2 with MockPlatformInterfaceMixin 3 implements FilePicker {} 4 5([FilePickerMock]) 6void main() { 7 final mock = MockFilePickerMock(); 8 setUp(() { 9 FilePicker.platform = mock; 10 });

投稿2024/12/11 01:47

ta.fu

総合スコア1722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問