Files
sf-app-platform/test

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.dartfoo_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 XRepository en lugar de build_runner para mocks.

Referencias