Estoy escribiendo pruebas unitarias para un sistema de dirección para un videojuego. El sistema tiene varios comportamientos (evite esta área debido a la razón A, evite esta área debido a la razón B, y cada uno agrega un poco de contexto a un mapa de la región. Una función separada analiza el mapa y produce el movimiento deseado.
Tengo problemas para decidir cómo escribir las pruebas unitarias para los comportamientos. Como sugiere TDD, solo estoy interesado en cómo los comportamientos afectan el movimiento deseado. Por ejemplo, evitar-por-razón-A debería resultar en un movimiento fuera de la mala posición sugerida. En realidad, no me importa cómo o por qué el comportamiento agrega contexto al mapa, solo que el movimiento deseado está lejos de la posición.
Entonces, mis pruebas para cada comportamiento configuran el comportamiento, lo hacen escribir en el mapa, luego ejecuta la función de análisis del mapa para calcular el movimiento deseado. Si ese movimiento satisface mis especificaciones, entonces estoy feliz.
Sin embargo, ahora mis pruebas dependen de que los comportamientos funcionen correctamente y de que la función de análisis de mapas funcione correctamente. Si la función de análisis falla, obtendría cientos de pruebas fallidas en lugar de un par. Muchas guías de redacción de exámenes sugieren que esta es una mala idea.
Sin embargo, si pruebo directamente contra la salida de los comportamientos burlándome del mapa, ¿entonces seguramente me acoplaré demasiado a la implementación? Si puedo obtener el mismo movimiento deseado del mapa usando un comportamiento ligeramente diferente, entonces las pruebas aún deberían pasar.
Así que ahora estoy sufriendo disonancia cognitiva. ¿Cuál es la mejor manera de estructurar estas pruebas?