J'écris des tests unitaires pour un système de direction pour un jeu vidéo. Le système a plusieurs comportements (éviter cette zone pour la raison A, éviter cette zone pour la raison B, chacun ajoutant un peu de contexte à une carte de la région. Une fonction distincte analyse ensuite la carte et produit le mouvement souhaité.
J'ai du mal à décider comment écrire les tests unitaires pour les comportements. Comme le suggère TDD, je ne m'intéresse qu'à la façon dont les comportements affectent le mouvement souhaité. Par exemple, éviter-pour-raison-A devrait entraîner un mouvement loin de la mauvaise position suggérée. Je me fiche de savoir comment ou pourquoi le comportement ajoute du contexte à la carte, mais seulement que le mouvement souhaité est éloigné de la position.
Donc, mes tests pour chaque comportement configurent le comportement, le font écrire sur la carte, puis exécutent la fonction d'analyse de carte pour déterminer le mouvement souhaité. Si ce mouvement satisfait mes spécifications, je suis content.
Cependant, maintenant mes tests dépendent à la fois des comportements qui fonctionnent correctement et de la fonction d'analyse de la carte qui fonctionnent correctement. Si la fonction d'analyse échoue, j'obtiendrais des centaines de tests ayant échoué plutôt que quelques. De nombreux guides de rédaction de tests suggèrent que c'est une mauvaise idée.
Cependant, si je teste directement par rapport à la sortie des comportements en se moquant de la carte, alors je me connecte sûrement trop étroitement à la mise en œuvre? Si je peux obtenir le même mouvement souhaité de la carte en utilisant un comportement légèrement différent, alors les tests devraient toujours réussir.
Alors maintenant, je souffre de dissonance cognitive. Quelle est la meilleure façon de structurer ces tests?