Estou escrevendo testes de unidade para um sistema de direção para um videogame. O sistema possui vários comportamentos (evite esta área por causa do motivo A, evite essa área por causa do motivo B, cada um adicionando um pouco de contexto a um mapa da região. Uma função separada analisa o mapa e produz o movimento desejado.
Estou tendo problemas para decidir como escrever os testes de unidade para os comportamentos. Como o TDD sugere, estou interessado apenas em como os comportamentos afetam o movimento desejado. Por exemplo, evitar por causa da razão A deve resultar em um movimento para longe da má posição sugerida. Na verdade, não me importo como ou por que o comportamento adiciona contexto ao mapa, apenas que o movimento desejado está longe da posição.
Portanto, meus testes para cada comportamento configuram o comportamento, fazem com que ele escreva no mapa e depois executa a função de análise de mapa para calcular o movimento desejado. Se esse movimento satisfaz minhas especificações, estou feliz.
No entanto, agora meus testes dependem dos comportamentos funcionando corretamente e da função de análise de mapa funcionando corretamente. Se a função de análise falhar, eu receberia centenas de testes com falha em vez de alguns. Muitos guias de redação de testes sugerem que é uma má ideia.
No entanto, se eu testar diretamente contra a saída dos comportamentos, zombando do mapa, então certamente estou acoplando muito fortemente à implementação? Se eu conseguir o mesmo movimento desejado no mapa usando um comportamento ligeiramente diferente, os testes ainda deverão passar.
Então agora estou sofrendo dissonância cognitiva. Qual é a melhor maneira de estruturar esses testes?