1

J'utilise SharpArch avec l'attribut [Transaction] de SharpArch.Contrib. L'attribut Transaction est ajouté à une méthode de service d'application et si une exception est levée au cours de cette méthode, les modifications apportées aux objets de domaine sont annulées. De toutes les apparences, cela fonctionne bien. Cependant, j'écris des tests NUnit pour confirmer que des exceptions sont levées quand c'est approprié (état non valide, erreurs de sécurité, etc.) mais je veux aussi confirmer que l'attribut Transaction est présent et fait son travail pour annuler les changements . Y a-t-il un moyen de le faire? Je fais confiance que l'attribut Transaction de SharpArch.Contrib est du code solide, mais un futur programmeur pourrait accidentellement retirer l'attribut Transaction d'une méthode ou le désactiver pendant un test qui ne serait pas détecté par les tests unitaires. Suis-je trop prudent?Comportement de l'attribut de test

Merci
Dan

Répondre

2

Je pense que vous être un peu paranoïaque, mais c'est OK :-)

Si vous faites confiance au code SharpArch, alors je ne vous inquiétez pas de l'exception étant rejeté à vous correctement. Supposons que cela fonctionne et ramasse tout problème lors de l'intégration ou des tests fonctionnels. Le test d'un code tiers n'a de valeur que si vous ne lui faites pas confiance ou si vous essayez de le comprendre. D'un autre côté, si vous voulez tester la présence d'un attribut (c'est-à-dire valider que la méthode a l'attribut approprié), vous pouvez écrire un test qui utilise la réflexion pour inspecter la signature de la méthode et faire quelques affirmations . Ce n'est pas trop difficile à faire - vous utilisez simplement l'objet methodinfo pour calculer les attributs de la méthode et rechercher le TransactionAttribute.

+0

Totalement. Ne pas tester les bibliothèques. Testez ce que vous faites avec eux. –

+0

Merci. Heureusement, l'attribut Transaction de SharpArchContrib peut être appliqué au niveau de la classe, et j'applique une interface de marqueur aux services d'application afin qu'ils puissent être installés dans le conteneur IoC. Cela facilite l'utilisation de la réflexion pour tester si le service classe l'attribut. – Dan

0

Je pense que le test transactionnalité de votre code est parfaitement logique. Je le ferais au niveau de l'intégration, lorsque vous vous connectez à la base de données réelle - il est alors facile de générer des données erronées, d'attraper l'exception et d'affirmer qu'aucune modification n'a été effectuée dans la base de données.

Je ne suis pas sûr de savoir comment vous le testeriez sur un niveau de test unitaire.

+0

Je suis d'accord avec Grzenio, en vérifiant que la gestion de vos transactions est correcte. Mais je pense que vous devriez le tester sans tester l'implémentation réelle. Testez l'analyse de rentabilisation et vérifiez qu'aucune donnée n'a été enregistrée si une exception a été générée, mais cela doit être valide indépendamment de l'infrastructure ou du code pour l'exécuter. – HAXEN