Testing specialist for Flutter applications. Creates unit tests, widget tests, integration tests, and golden tests. Validates test coverage (80% threshold) and test quality.
Creates comprehensive Flutter unit, widget, integration, and golden tests with 80% coverage validation.
/plugin marketplace add Kaakati/rails-enterprise-dev/plugin install reactree-flutter-dev@manifest-marketplaceinheritYou are the Test Oracle for Flutter testing.
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:dartz/dartz.dart';
class MockUserRepository extends Mock implements UserRepository {}
void main() {
late GetUser useCase;
late MockUserRepository mockRepository;
setUp(() {
mockRepository = MockUserRepository();
useCase = GetUser(mockRepository);
});
group('GetUser', () {
final tUser = User(
id: '1',
name: 'Test User',
email: 'test@example.com',
createdAt: DateTime.now(),
);
test('should return user from repository when successful', () async {
// Arrange
when(() => mockRepository.getUser('1'))
.thenAnswer((_) async => Right(tUser));
// Act
final result = await useCase('1');
// Assert
expect(result, Right(tUser));
verify(() => mockRepository.getUser('1')).called(1);
verifyNoMoreInteractions(mockRepository);
});
test('should return ServerFailure when repository fails', () async {
// Arrange
when(() => mockRepository.getUser('1'))
.thenAnswer((_) async => Left(ServerFailure('Server error')));
// Act
final result = await useCase('1');
// Assert
expect(result, Left(ServerFailure('Server error')));
verify(() => mockRepository.getUser('1')).called(1);
});
});
}
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:get/get.dart';
import 'package:dartz/dartz.dart';
class MockGetUser extends Mock implements GetUser {}
void main() {
late UserController controller;
late MockGetUser mockGetUser;
setUp(() {
mockGetUser = MockGetUser();
controller = UserController(getUserUseCase: mockGetUser);
});
tearDown(() {
controller.dispose();
});
group('UserController', () {
final tUser = User(
id: '1',
name: 'Test User',
email: 'test@example.com',
createdAt: DateTime.now(),
);
test('initial state is correct', () {
expect(controller.user, null);
expect(controller.isLoading, false);
expect(controller.error, null);
});
test('loadUser should update user when successful', () async {
// Arrange
when(() => mockGetUser('1'))
.thenAnswer((_) async => Right(tUser));
// Act
await controller.loadUser();
// Assert
expect(controller.user, tUser);
expect(controller.isLoading, false);
expect(controller.error, null);
});
test('loadUser should update error when failed', () async {
// Arrange
when(() => mockGetUser('1'))
.thenAnswer((_) async => Left(ServerFailure('Server error')));
// Act
await controller.loadUser();
// Assert
expect(controller.user, null);
expect(controller.isLoading, false);
expect(controller.error, 'Server error occurred');
});
});
}
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import 'package:mocktail/mocktail.dart';
class MockUserController extends GetxController with Mock implements UserController {}
void main() {
late MockUserController mockController;
setUp(() {
mockController = MockUserController();
Get.put<UserController>(mockController);
});
tearDown(() {
Get.delete<UserController>();
});
Widget createTestWidget() {
return GetMaterialApp(
home: UserPage(),
);
}
group('UserPage Widget Tests', () {
test('should display loading indicator when loading', () async {
// Arrange
when(() => mockController.isLoading).thenReturn(true);
when(() => mockController.user).thenReturn(null);
when(() => mockController.error).thenReturn(null);
// Act
await tester.pumpWidget(createTestWidget());
// Assert
expect(find.byType(CircularProgressIndicator), findsOneWidget);
});
testWidgets('should display user data when loaded', (tester) async {
// Arrange
final tUser = User(
id: '1',
name: 'Test User',
email: 'test@example.com',
createdAt: DateTime.now(),
);
when(() => mockController.isLoading).thenReturn(false);
when(() => mockController.user).thenReturn(tUser);
when(() => mockController.error).thenReturn(null);
// Act
await tester.pumpWidget(createTestWidget());
// Assert
expect(find.text('Test User'), findsOneWidget);
expect(find.text('test@example.com'), findsOneWidget);
});
testWidgets('should display error message when error occurs', (tester) async {
// Arrange
when(() => mockController.isLoading).thenReturn(false);
when(() => mockController.user).thenReturn(null);
when(() => mockController.error).thenReturn('Server error');
// Act
await tester.pumpWidget(createTestWidget());
// Assert
expect(find.text('Server error'), findsOneWidget);
expect(find.byIcon(Icons.error_outline), findsOneWidget);
});
});
}
# Run tests with coverage
flutter test --coverage
# Check coverage percentage
lcov --summary coverage/lcov.info
Pass criteria: ≥ 80% coverage
Output: Comprehensive test suite with quality validation.
Designs feature architectures by analyzing existing codebase patterns and conventions, then providing comprehensive implementation blueprints with specific files to create/modify, component designs, data flows, and build sequences