chore(legacy): add test infrastructure + mocktail
This commit is contained in:
121
test/README.md
Normal file
121
test/README.md
Normal file
@@ -0,0 +1,121 @@
|
||||
# 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:
|
||||
|
||||
```yaml
|
||||
# pubspec.yaml
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
mocktail: ^1.0.4
|
||||
```
|
||||
|
||||
Y si va a consumir los helpers compartidos:
|
||||
|
||||
```yaml
|
||||
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/**`:
|
||||
|
||||
```dart
|
||||
import 'package:sf_shared/testing.dart';
|
||||
```
|
||||
|
||||
### `pumpApp(tester, child:, overrides:, locale:)`
|
||||
|
||||
Pone el widget bajo test dentro de `ProviderScope` + `MaterialApp` + `SFLocalizations`.
|
||||
|
||||
```dart
|
||||
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:
|
||||
|
||||
```dart
|
||||
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
|
||||
|
||||
```dart
|
||||
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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
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 XRepository` en lugar de build_runner para mocks.
|
||||
|
||||
## Referencias
|
||||
|
||||
- [mocktail docs](https://pub.dev/packages/mocktail)
|
||||
- [flutter_test docs](https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html)
|
||||
- `sf-legacy-migration-checklist.md` — plan de migración que consume estos helpers.
|
||||
Reference in New Issue
Block a user