@@ -15,6 +15,9 @@ import 'main_screen_with_mocks_test.mocks.dart';
15
15
void main () {
16
16
group ("MainScreen()" , () {
17
17
late List <Video > videos;
18
+ late MockGrpcClient mockGrpcClient;
19
+ late MockFavoriteVideoViewModel mockFavoriteVideoViewModel;
20
+ late MockCustomTheme mockCustomTheme;
18
21
19
22
setUp (() {
20
23
final video1 = Video ()
@@ -26,69 +29,61 @@ void main() {
26
29
..prId = 2
27
30
..link = "video-link2" ;
28
31
videos = List .of ([video1, video2]);
32
+
33
+ mockGrpcClient = MockGrpcClient ();
34
+ mockFavoriteVideoViewModel = MockFavoriteVideoViewModel ();
35
+ mockCustomTheme = MockCustomTheme ();
29
36
});
30
37
31
38
testWidgets ('MainWidget has a load view' , (WidgetTester tester) async {
32
- final devClient = MockGrpcClient ();
33
- when (devClient.getVideos ()).thenAnswer ((_) => Future .value (videos));
34
- await tester.pumpWidget (MultiProvider (
35
- providers: [
36
- Provider <GrpcClient >(create: (context) => devClient),
37
- ChangeNotifierProvider (create: (context) => null ),
38
- ],
39
- builder: (context, child) => MainScreen (),
40
- ));
39
+ when (mockGrpcClient.getVideos ()).thenAnswer ((_) => Future .value (videos));
40
+ await tester.pumpWidget (wrapWithProviders (
41
+ mockGrpcClient: mockGrpcClient,
42
+ mockCustomTheme: mockCustomTheme,
43
+ mockFavoriteVideoViewModel: mockFavoriteVideoViewModel));
41
44
42
45
final loadView = find.byType (CircularProgressIndicator );
43
46
expect (loadView, findsOneWidget);
44
47
});
45
48
46
49
testWidgets ("has clickable list tile" , (WidgetTester tester) async {
47
- final devClient = MockGrpcClient ();
48
- when (devClient.getVideos ()).thenAnswer ((_) => Future .value (videos));
49
-
50
- final mockVM = MockFavoriteVideoViewModel ();
51
- when (mockVM.favoriteVideosMap).thenAnswer ((_) => Future .value ({}));
52
- when (mockVM.isFavoriteVideo (1 )).thenAnswer ((_) => Future .value (false ));
53
- when (mockVM.isFavoriteVideo (2 )).thenAnswer ((_) => Future .value (false ));
54
- await tester.pumpWidget (MultiProvider (
55
- providers: [
56
- Provider <GrpcClient >(create: (context) => devClient),
57
- ChangeNotifierProvider (create: (context) => null ),
58
- ChangeNotifierProvider <FavoriteVideoViewModel >(
59
- create: (context) => mockVM),
60
- ],
61
- builder: (context, child) => MaterialApp (home: MainScreen ()),
62
- ));
50
+ when (mockGrpcClient.getVideos ()).thenAnswer ((_) => Future .value (videos));
51
+
52
+ when (mockFavoriteVideoViewModel.favoriteVideosMap)
53
+ .thenAnswer ((_) => Future .value ({}));
54
+ when (mockFavoriteVideoViewModel.isFavoriteVideo (1 ))
55
+ .thenAnswer ((_) => Future .value (false ));
56
+ when (mockFavoriteVideoViewModel.isFavoriteVideo (2 ))
57
+ .thenAnswer ((_) => Future .value (false ));
58
+
59
+ await tester.pumpWidget (wrapWithProviders (
60
+ mockGrpcClient: mockGrpcClient,
61
+ mockCustomTheme: mockCustomTheme,
62
+ mockFavoriteVideoViewModel: mockFavoriteVideoViewModel));
63
63
await tester.pumpAndSettle ();
64
64
final firstTile = find.byKey (const ValueKey ("ListTile-1" ));
65
65
expect (firstTile, findsOneWidget);
66
66
});
67
67
68
68
testWidgets ("Clicking the toggle dark/light mode changes the theme" ,
69
69
(WidgetTester tester) async {
70
- final devClient = MockGrpcClient ();
71
- when (devClient.getVideos ()).thenAnswer ((_) => Future .value (videos));
72
-
73
- final mockTheme = MockCustomTheme ();
74
- when (mockTheme.themeMode).thenReturn (ThemeMode .dark);
75
- when (mockTheme.icon).thenReturn (Icons .dark_mode);
76
- when (mockTheme.text).thenReturn ("다크모드" );
77
-
78
- final mockVM = MockFavoriteVideoViewModel ();
79
- when (mockVM.favoriteVideosMap).thenAnswer ((_) => Future .value ({}));
80
- when (mockVM.isFavoriteVideo (1 )).thenAnswer ((_) => Future .value (false ));
81
- when (mockVM.isFavoriteVideo (2 )).thenAnswer ((_) => Future .value (false ));
82
-
83
- await tester.pumpWidget (MultiProvider (
84
- providers: [
85
- Provider <GrpcClient >(create: (context) => devClient),
86
- ChangeNotifierProvider <CustomTheme >(create: (context) => mockTheme),
87
- ChangeNotifierProvider <FavoriteVideoViewModel >(
88
- create: (context) => mockVM),
89
- ],
90
- builder: (context, child) => MaterialApp (home: MainScreen ()),
91
- ));
70
+ when (mockGrpcClient.getVideos ()).thenAnswer ((_) => Future .value (videos));
71
+
72
+ when (mockCustomTheme.themeMode).thenReturn (ThemeMode .dark);
73
+ when (mockCustomTheme.icon).thenReturn (Icons .dark_mode);
74
+ when (mockCustomTheme.text).thenReturn ("다크모드" );
75
+
76
+ when (mockFavoriteVideoViewModel.favoriteVideosMap)
77
+ .thenAnswer ((_) => Future .value ({}));
78
+ when (mockFavoriteVideoViewModel.isFavoriteVideo (1 ))
79
+ .thenAnswer ((_) => Future .value (false ));
80
+ when (mockFavoriteVideoViewModel.isFavoriteVideo (2 ))
81
+ .thenAnswer ((_) => Future .value (false ));
82
+
83
+ await tester.pumpWidget (wrapWithProviders (
84
+ mockGrpcClient: mockGrpcClient,
85
+ mockCustomTheme: mockCustomTheme,
86
+ mockFavoriteVideoViewModel: mockFavoriteVideoViewModel));
92
87
await tester.pumpAndSettle ();
93
88
94
89
// GIVEN the theme toggle button.
@@ -101,7 +96,23 @@ void main() {
101
96
await tester.tap (btn);
102
97
103
98
// THEN toggleMode function has been called.
104
- verify (mockTheme .toggleMode ()).called (1 );
99
+ verify (mockCustomTheme .toggleMode ()).called (1 );
105
100
});
106
101
});
107
102
}
103
+
104
+ /// wrapWithProviders is a helper function that initializes material app with mock providers.
105
+ MultiProvider wrapWithProviders (
106
+ {required MockGrpcClient mockGrpcClient,
107
+ required MockCustomTheme mockCustomTheme,
108
+ required MockFavoriteVideoViewModel mockFavoriteVideoViewModel}) {
109
+ return MultiProvider (
110
+ providers: [
111
+ Provider <GrpcClient >(create: (context) => mockGrpcClient),
112
+ ChangeNotifierProvider <CustomTheme >(create: (context) => mockCustomTheme),
113
+ ChangeNotifierProvider <FavoriteVideoViewModel >(
114
+ create: (context) => mockFavoriteVideoViewModel),
115
+ ],
116
+ builder: (context, child) => MaterialApp (home: MainScreen ()),
117
+ );
118
+ }
0 commit comments