en bref, throwsA(anything)
ne me suffit pas lors des tests unitaires dans Dart. Comment tester un message ou type d'erreur spécifique?
Voici l'erreur que je voudrais attraper:
class MyCustErr implements Exception {
String term;
String errMsg() => 'You have already added a container with the id
$term. Duplicates are not allowed';
MyCustErr({this.term});
}
voici l'assertion actuelle qui passe, mais voudrait vérifier le type d'erreur ci-dessus:
expect(() => operations.lookupOrderDetails(), throwsA(anything));
Voici ce que je veux faire:
expect(() => operations.lookupOrderDetails(), throwsA(MyCustErr));
Cela devrait faire ce que vous voulez:
expect(() => operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));
expect(() => operations.lookupOrderDetails(), isInstanceOf<MyCustErr>());
si vous voulez juste vérifier l'exception, vérifiez ceci réponse :
Après que "TypeMatcher <>" a été déprécié dans Flutter 1.12.1, j'ai trouvé que cela fonctionnait:
expect(() => operations.lookupOrderDetails(), throwsA(isInstanceOf<MyCustErr>()));
Importez d'abord le package correct 'package: matcher/matcher.Dart';
expect(() => yourOperation.yourMethod(),
throwsA(const TypeMatcher<YourException>()));
Au cas où quelqu'un voudrait tester avec une fonction asynchrone comme je devais faire, tout ce que vous avez à faire est d'ajouter le mot clé async
dans l'attente, en gardant à l'esprit que le lookupOrderDetails
est une fonction asynchrone:
expect(() **async** => **await** operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));
expect(() **async** => **await** operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));
Il utilise toujours la réponse de Gunter qui est très bonne!