J'ai une classe qui est refactorisée en 1 classe principale et 2 classes plus petites. Les classes principales utilisent la base de données (comme beaucoup de mes classes) et envoient un e-mail. La classe principale a donc un IPersonRepository
et un IEmailRepository
injecté qui à son tour envoie aux 2 classes plus petites.
Maintenant, je veux tester unitaire la classe principale, et j'ai appris à ne pas uniter le fonctionnement interne de la classe, parce que nous devrions pouvoir changer le fonctionnement interne sans casser les tests unitaires.
Mais comme la classe utilise le IPersonRepository
et un IEmailRepository
, JE DOIS spécifier (mock / dummy) les résultats de certaines méthodes pour le IPersonRepository
. La classe principale calcule certaines données sur la base des données existantes et les renvoie. Si je veux tester cela, je ne vois pas comment je peux écrire un test sans spécifier que le IPersonRepository.GetSavingsByCustomerId
retourne x. Mais ensuite, mon test unitaire «connaît» le fonctionnement interne, car il «sait» quelles méthodes se moquer et lesquelles ne le sont pas.
Comment puis-je tester une classe qui a injecté des dépendances, sans que le test connaisse les internes?
Contexte:
D'après mon expérience, de nombreux tests comme celui-ci créent des simulations pour les référentiels, puis fournissent les bonnes données pour les simulations ou testent si une méthode spécifique a été appelée pendant l'exécution. Quoi qu'il en soit, le test connaît les éléments internes.
Maintenant, j'ai vu une présentation sur la théorie (que j'ai entendue auparavant) selon laquelle le test ne devrait pas connaître l'implémentation. D'abord parce que vous ne testez pas comment cela fonctionne, mais aussi parce que lorsque vous modifiez maintenant l'implémentation, tous les tests unitaires échouent parce qu'ils «connaissent» l'implémentation. Bien que j'aime que le concept des tests ne soit pas au courant de l'implémentation, je ne sais pas comment l'accomplir.
IPersonRepository
objet, cette interface et toutes les méthodes qu'elle décrit ne sont plus "internes", donc ce n'est pas vraiment un problème de test. Votre vraie question devrait être "comment puis-je refactoriser des classes en unités plus petites sans trop exposer en public". La réponse est "garder ces interfaces allégées" (en respectant le principe de séparation des interfaces, par exemple). C'est le point 2 à mon humble avis dans la réponse de @ DavidArno (je suppose qu'il n'est pas nécessaire que je répète cela dans une autre réponse).