Migration Dart Checks
Quand utiliser cette compétence
Utilisez cette compétence quand :
- Vous migrez des fichiers de test existants de
package:matcherverspackage:checks. - Un utilisateur demande spécifiquement des "modern checks" ou similaire.
Le flux de travail
- Analyse :
- Utilisez
greppour identifier les fichiers utilisantexpectoupackage:matcher. - Passez en revue les matchers personnalisés ; ceux-ci peuvent nécessiter une migration manuelle.
- Utilisez
- Outils et dépendances :
- Assurez-vous que
dev_dependenciesinclutchecks. - Exécutez
dart pub add --dev checkssi manquant.
- 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 Motifs courants ci-dessous.
- Étape finale : Remplacez
import 'package:test/test.dart';parimport 'package:test/scaffolding.dart';UNIQUEMENT après que tous les appelsexpectsoient remplacés. Cela assure une progression incrémentale.
- Ajoutez
- Vérification :
- Assurez-vous que le code s'analyse correctement.
- Assurez-vous que les tests passent.
Stratégies de découverte
Pour trouver des candidats à la migration, utilisez les stratégies de recherche suivantes :
Fichiers utilisant des matchers hérités
Recherchez des 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 des 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
Motifs 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 et futures (CRITIQUE)
-
Vérifier les fonctions async :
check(() => asyncFunc()).throws<T>()cause des FAUX POSITIFS car la fermeture retourne uneFuture, qui est une valeur, donc elle "se termine normalement" (en tant que Future). Utilisation correcte :await check(asyncFunc()).throws<T>(); -
Chaînage sur les retours void : De nombreuses méthodes check async (comme
throws) retournentFuture<void>. Vous ne pouvez pas les chaîner directement. 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 approfondie 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)); // Lors de la vérification de plusieurs propriétés
Moderne :
check(obj)
..has((e) => e.prop, 'prop').equals(value)
..has((e) => e.other, 'other').equals(otherValue);
Cascades d'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
- Portée : Ne modifiez que les fichiers dans
test/(etpubspec.yaml). - Exactitude : 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écurité des types :
package:checksest plus strict sur les types quematcher. Vous devrez peut-être ajouter des castsas Texplicites ou des vérificationsisA<T>()dans la chaîne.
Compétences associées
- dart-test-fundamentals : Concepts clés pour structurer les tests, les cycles de vie et la configuration.
- dart-matcher-best-practices :
Bonnes pratiques pour le
package:matchertraditionnel qui est en cours de migration.