Si vous voulez dire privé comme je pense que vous le pensez, alors non - vous ne devriez pas le tester à l'unité. Vous ne devez tester en unités que les comportements / états observables. Il se peut que vous manquiez le point derrière le cycle "red-green-refactor" du TDD (et si vous ne faites pas de test en premier, le même principe s'applique). Une fois les tests écrits et réussis, vous ne voulez pas qu'ils changent pendant la refactorisation. Si vous êtes obligé de tester les fonctionnalités privées de manière unitaire, cela signifie probablement que les tests unitaires autour de la fonctionnalité publique sont défectueux. S'il est difficile et complexe d'écrire des tests autour du code public, alors votre classe en fait peut-être trop ou votre problème n'est pas clairement défini.
Pire encore, au fil du temps, vos tests unitaires deviendront une boule et une chaîne qui vous ralentiront sans ajouter de valeur (la modification de la mise en œuvre, par exemple l'optimisation ou la suppression de la duplication, ne devrait avoir aucun effet sur les tests unitaires). Le code interne doit cependant être testé unitaire car le comportement / l'état est observable (juste de manière restreinte).
Quand j'ai fait des tests unitaires pour la première fois, j'ai tiré toutes sortes de trucs pour tester des trucs privés, mais maintenant, avec quelques années à mon actif, je vois cela comme pire qu'une perte de temps.
Voici un exemple un peu idiot, bien sûr, dans la vraie vie, vous auriez plus de tests que ceux-ci:
Disons que vous avez une classe qui retourne une liste triée de chaînes - vous devez vérifier que le résultat est trié, pas comment il trie réellement cette liste. Vous pouvez démarrer votre implémentation avec un seul algorithme qui trie simplement la liste. Une fois cela fait, votre test n'a pas besoin de changer si vous changez ensuite votre algorithme de tri. À ce stade, vous avez un seul test (en supposant que le tri est intégré dans votre classe):
- Mon résultat est-il trié?
Supposons maintenant que vous vouliez deux algorithmes (peut-être que l'un est plus efficace dans certaines circonstances mais pas dans d'autres), alors chaque algorithme pourrait (et devrait généralement) être fourni par une classe différente et votre classe les choisit - vous pouvez vérifier que cela se produit pour vos scénarios choisis en utilisant des simulations, mais votre test d'origine est toujours valide et comme nous vérifions uniquement le comportement / l'état observable, il n'a pas besoin de changer. Vous vous retrouvez avec 3 tests:
- Mon résultat est-il trié?
- Étant donné un scénario (disons que la liste initiale est presque triée pour commencer), un appel est-il fait à la classe qui trie les chaînes à l'aide de l'algorithme X?
- Étant donné un scénario (la liste initiale est dans un ordre aléatoire), un appel est-il fait à la classe qui trie les chaînes en utilisant l'algorithme Y?
L'alternative aurait été de commencer à tester du code privé à l'intérieur de votre classe - vous n'y gagnez rien - les tests ci-dessus me disent tout ce que je dois savoir en ce qui concerne les tests unitaires. En ajoutant des tests privés, vous vous construisez une veste droite, combien de travail serait-ce si vous vérifiiez non seulement que le résultat était trié, mais aussi comment il était trié?
Les tests (de ce type) ne devraient changer que lorsque le comportement change, commencer à écrire des tests par rapport au code privé et cela sort par la fenêtre.