Assume `LoginScreen` creates its bloc from GetIt: ```dart BlocProvider( create: (_) => getIt<AuthBloc>(), child: const LoginScreenView(), ) ``` Register a shared mock before the widget is built: ```dart // test/shared/mocks.dart class MockAuthBloc extends Mock implements AuthBloc {} ``` ```dart late MockAuthBloc authBloc; setUpAll(() { TestWrapper.init(); authBloc = MockAuthBloc(); getIt.registerFactory<AuthBloc>(() => authBloc); }); setUp(() { when(() => authBloc.state).thenReturn(const Auth...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add HoangNguyen0403/agent-skills-standard --skill flutter-testing --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Flutter Testing?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/hoangnguyen0403-flutter-testing-0cde3e48)More formats (shields.io, HTML) on the badges page.
Assume `LoginScreen` creates its bloc from GetIt:
```dart
BlocProvider(
create: (_) => getIt<AuthBloc>(),
child: const LoginScreenView(),
)
```
Register a shared mock before the widget is built:
```dart
// test/shared/mocks.dart
class MockAuthBloc extends Mock implements AuthBloc {}
```
```dart
late MockAuthBloc authBloc;
setUpAll(() {
TestWrapper.init();
authBloc = MockAuthBloc();
getIt.registerFactory<AuthBloc>(() => authBloc);
});
setUp(() {
when(() => authBloc.state).thenReturn(const AuthInitial());
when(() => authBloc.stream).thenAnswer(
(_) => const Stream<AuthState>.empty(),
);
});
```
Build the screen through the project test wrapper:
```dart
Future<void> pumpScreen(
WidgetTester tester, {
bool settle = true,
}) async {
await tester.pumpLocalizedWidget(const LoginScreen());
if (settle) {
await tester.pumpAndSettle();
}
}
```
For state transitions, use `whenListen`:
```dart
whenListen(
authBloc,
Stream<AuthState>.fromIterable([
const AuthLoading(),
const AuthAuthenticated(),
]),
initialState: const AuthInitial(),
);
```
Keep UI interactions and assertions in a robot, using `WidgetKeys` constants rather than inline `Key` values:
```dart
class LoginRobot {
LoginRobot(this.tester);
final WidgetTester tester;
Future<void> tapLogin() async {
await tester.tap(find.byKey(WidgetKeys.loginButton));
await tester.pump();
}
void expectLoadingVisible() {
expect(find.byKey(WidgetKeys.loginLoading), findsOneWidget);
}
}
```
If `LoginScreen` constructs `AuthBloc()` directly instead of resolving it through GetIt, the mock cannot replace it externally; expose a bloc factory or constructor dependency, or change the internal `BlocProvider` to use the GetIt registration.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!