Migration Dart Checks
Quand utiliser cette skill
Utilisez cette skill quand :
- Vous migrez des fichiers de test existants de
package:matcherverspackage:checks. - Un utilisateur demande spécifiquement des « modern checks » ou similaire.
Le Workflow
- Analyse :
- Utilisez
greppour identifier les fichiers utilisantexpectoupackage:matcher. - Examinez les matchers personnalisés ; ils peuvent nécessiter une migration manuelle.
- Utilisez
- Outils & Dépendances :
- Assurez-vous que
dev_dependenciesinclutchecks. - Exécutez
dart pub add --dev checkssi absent.
- Assurez-vous que
- Découverte :
- Utilisez les Stratégies de Découverte ci-dessous pour trouver les candidats.
- Remplacement :
- Ajoutez
import 'package:checks/checks.dart';. - Appliquez les Patterns Courants ci-dessous.
- Dernière étape : Remplacez
import 'package:test/test.dart';parimport 'package:test/scaffolding.dart';UNIQUEMENT après que tous les appelsexpectsoient remplacés. Cela garantit une progression incrémentale.
- Ajoutez
- Vérification :
- Assurez-vous que le code s'analyse sans erreurs.
- Assurez-vous que les tests passent.
Stratégies de Découverte
Pour trouver les candidats à la migration, utilisez les stratégies de recherche suivantes :
Fichiers utilisant des Matchers Hérités
Recherchez les fichiers de test qui importent package:test/test.dart ou utilisent expect :
- Requête de recherche :
import 'package:test/test.dart'; - Regex :
expect\(
Matchers Spécifiques à Cibler
Recherchez les matchers spécifiques qui sont faciles à migrer :
- Regex :
expect\(.*,\s*equals\( - Regex :
expect\(.*,\s*isNull\) - Regex :
expect\(.*,\s*isTrue\) - Regex :
expect\(.*,\s*isFalse\) - Regex :
expect\(.*,\s*throwsA
Patterns Courants
expect hérité |
check moderne |
|---|---|
expect(a, equals(b)) |
check(a).equals(b) |
expect(a, isTrue) |
check(a).isTrue() |
expect(a, isFalse) |
check(a).isFalse() |
expect(a, isNull) |
check(a).isNull() |
expect(a, isNotNull) |
check(a).isNotNull() |
expect(() => fn(), throwsA<T>()) |
check(() => fn()).throws<T>() |
expect(list, hasLength(n)) |
check(list).length.equals(n) |
expect(a, closeTo(b, delta)) |
check(a).isA<num>().isCloseTo(b, delta) |
expect(a, greaterThan(b)) |
check(a).isGreaterThan(b) |
expect(a, lessThan(b)) |
check(a).isLessThan(b) |
expect(list, isEmpty) |
check(list).isEmpty() |
expect(list, isNotEmpty) |
check(list).isNotEmpty() |
expect(list, contains(item)) |
check(list).contains(item) |
expect(map, equals(otherMap)) |
check(map).deepEquals(otherMap) |
expect(list, equals(otherList)) |
check(list).deepEquals(otherList) |
expect(future, completes) |
await check(future).completes() |
expect(stream, emitsInOrder(...)) |
await check(stream).withQueue.inOrder(...) |
Async & Futures (CRITIQUE)
-
Vérification des fonctions async :
check(() => asyncFunc()).throws<T>()provoque des FAUX POSITIFS car la closure retourne unFuture, qui est une valeur, donc elle « se termine normalement » (comme un Future). Usage Correct :await check(asyncFunc()).throws<T>(); -
Chaînage sur retours void : Beaucoup de méthodes check async (comme
throws) retournentFuture<void>. Vous ne pouvez pas chaîner directement dessus. Utilisez des cascades ou des callbacks. Incorrect :await check(future) .throws<Error>() .has((e) => e.message, 'message') .equals('foo');Correct :
await check(future).throws<Error>( (it) => it.has((e) => e.message, 'message').equals('foo'));
Exemples Complexes
Vérification Profonde avec isA et having :
Hérité :
expect(() => foo(), throwsA(isA<ArgumentError>()
.having((e) => e.message, 'message', contains('MSG'))));
Moderne :
check(() => foo())
.throws<ArgumentError>()
.has((e) => e.message, 'message')
.contains('MSG');
Extraction de Propriété :
Hérité :
expect(obj.prop, equals(value)); // Quand on vérifie plusieurs props
Moderne :
check(obj)
..has((e) => e.prop, 'prop').equals(value)
..has((e) => e.other, 'other').equals(otherValue);
Cascades sur une Ligne :
Puisque les checks retournent souvent void, utilisez des cascades pour plusieurs assertions
sur le même sujet.
check(it)..isGreaterThan(10)..isLessThan(20);
Contraintes
- Périmètre : Modifiez uniquement les fichiers dans
test/(etpubspec.yaml). - Correction : Un test échouant est inacceptable. Si un test échoue après la migration et que vous ne pouvez pas le corriger immédiatement, ANNULEZ ce changement spécifique.
- Sûreté de Type :
package:checksest plus strict quant aux types quematcher. Vous devrez peut-être ajouter des casts explicitesas Tou des vérificationsisA<T>()dans la chaîne.
Skills Connexes
- dart-test-fundamentals : Concepts fondamentaux pour structurer les tests, les cycles de vie et la configuration.
- dart-matcher-best-practices :
Bonnes pratiques pour le
package:matchertraditionnel en cours de migration.