Tests — sf-app-platform
Patrón estándar para los tests del monorepo. Cada package/module tiene su propia carpeta test/.
Setup mínimo
Todo package que vaya a tener tests debe agregar:
# pubspec.yaml
dev_dependencies:
flutter_test:
sdk: flutter
mocktail: ^1.0.4
Y si va a consumir los helpers compartidos:
dependencies: # puede ir en dev_dependencies si solo se usa en tests
sf_shared:
path: ../../packages/sf_shared # ajustar ruta relativa
Helpers compartidos — package:sf_shared/testing.dart
Se importan SOLO desde archivos test/**:
import 'package:sf_shared/testing.dart';
pumpApp(tester, child:, overrides:, locale:)
Pone el widget bajo test dentro de ProviderScope + MaterialApp + SFLocalizations.
testWidgets('my screen shows title', (tester) async {
await pumpApp(
tester,
child: const MyScreen(),
overrides: [
myRepositoryProvider.overrideWithValue(MockRepository()),
],
);
expect(find.text('Title'), findsOneWidget);
});
makeContainer(overrides:)
Para unit-testing de notifiers/providers sin widgets:
test('controller emits AsyncError on failure', () async {
final container = makeContainer(
overrides: [
myRepositoryProvider.overrideWithValue(ThrowingRepository()),
],
);
addTearDown(container.dispose);
await container.read(myControllerProvider.notifier).submit();
expect(container.read(myControllerProvider).hasError, isTrue);
});
Mockeo de repositorios con mocktail
class MockUsersRepository extends Mock implements UsersRepository {}
void main() {
late MockUsersRepository mockRepo;
setUp(() {
mockRepo = MockUsersRepository();
});
test('loads users happy path', () async {
when(() => mockRepo.getUsers(userId: any(named: 'userId')))
.thenAnswer((_) async => [const UserEntity(...)]);
// ...
});
}
Correr tests
# Todos los tests del package actual
flutter test
# Un archivo específico
flutter test test/canary_test.dart
# Con coverage
flutter test --coverage
Para correr tests de un package del monorepo:
cd modules/legacy/modules/account && flutter test
Convenciones
- 1 archivo de test por archivo de producción cuando sea posible (
foo_screen.dart→foo_screen_test.dart). - Happy path + ≥1 error path por feature migrada (ver
sf-legacy-migration-checklist.md). - Golden tests — no hay setup global todavía. Si una feature lo justifica, discutir antes.
- Mocks no autogenerados — usamos mocktail con
Mock implements XRepositoryen lugar de build_runner para mocks.
Referencias
- mocktail docs
- flutter_test docs
sf-legacy-migration-checklist.md— plan de migración que consume estos helpers.