Skip to content

Commit 4edbd38

Browse files
committed
refactor(client): refactor Flutter test
- Group mock objects and initialize them in a separate function.
1 parent 30b4290 commit 4edbd38

File tree

1 file changed

+59
-48
lines changed

1 file changed

+59
-48
lines changed

client/test/screens/main_screen_with_mocks_test.dart

Lines changed: 59 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import 'main_screen_with_mocks_test.mocks.dart';
1515
void main() {
1616
group("MainScreen()", () {
1717
late List<Video> videos;
18+
late MockGrpcClient mockGrpcClient;
19+
late MockFavoriteVideoViewModel mockFavoriteVideoViewModel;
20+
late MockCustomTheme mockCustomTheme;
1821

1922
setUp(() {
2023
final video1 = Video()
@@ -26,69 +29,61 @@ void main() {
2629
..prId = 2
2730
..link = "video-link2";
2831
videos = List.of([video1, video2]);
32+
33+
mockGrpcClient = MockGrpcClient();
34+
mockFavoriteVideoViewModel = MockFavoriteVideoViewModel();
35+
mockCustomTheme = MockCustomTheme();
2936
});
3037

3138
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));
4144

4245
final loadView = find.byType(CircularProgressIndicator);
4346
expect(loadView, findsOneWidget);
4447
});
4548

4649
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));
6363
await tester.pumpAndSettle();
6464
final firstTile = find.byKey(const ValueKey("ListTile-1"));
6565
expect(firstTile, findsOneWidget);
6666
});
6767

6868
testWidgets("Clicking the toggle dark/light mode changes the theme",
6969
(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));
9287
await tester.pumpAndSettle();
9388

9489
// GIVEN the theme toggle button.
@@ -101,7 +96,23 @@ void main() {
10196
await tester.tap(btn);
10297

10398
// THEN toggleMode function has been called.
104-
verify(mockTheme.toggleMode()).called(1);
99+
verify(mockCustomTheme.toggleMode()).called(1);
105100
});
106101
});
107102
}
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

Comments
 (0)