Tengo una clase que se refactoriza en 1 clase principal y 2 clases más pequeñas. Las clases principales usan la base de datos (como hacen muchas de mis clases) y envían un correo electrónico. Entonces, la clase principal tiene un IPersonRepositoryy un IEmailRepositoryinyectado que a su vez envía a las 2 clases más pequeñas.
Ahora quiero hacer una prueba unitaria de la clase principal, y he aprendido a no hacer una prueba unitaria del funcionamiento interno de la clase, porque deberíamos poder cambiar el funcionamiento interno sin interrumpir las pruebas unitarias.
Pero como la clase usa el IPersonRepositoryy an IEmailRepository, DEBO especificar resultados (simulados / ficticios) para algunos métodos para el IPersonRepository. La clase principal calcula algunos datos basados en datos existentes y los devuelve. Si quiero probar eso, no veo cómo puedo escribir una prueba sin especificar que IPersonRepository.GetSavingsByCustomerIddevuelve x. Pero entonces mi prueba unitaria 'sabe' sobre el funcionamiento interno, porque 'sabe' qué métodos burlarse y cuáles no.
¿Cómo puedo probar una clase que ha inyectado dependencias, sin que la prueba conozca las partes internas?
antecedentes:
En mi experiencia, muchas pruebas como esta crean simulacros para los repositorios y luego proporcionan los datos correctos para las simulaciones o prueban si se llamó a un método específico durante la ejecución. De cualquier manera, la prueba conoce los aspectos internos.
Ahora he visto una presentación sobre la teoría (que he escuchado antes) de que la prueba no debe saber sobre la implementación. Primero porque no está probando cómo funciona, sino también porque cuando ahora cambia la implementación, todas las pruebas unitarias fallan porque 'saben' sobre la implementación. Si bien me gusta que el concepto de las pruebas desconozca la implementación, no sé cómo lograrlo.
IPersonRepositoryobjeto, esa interfaz y todos los métodos que describe ya no son "internos", por lo que en realidad no es un problema de la prueba. Su verdadera pregunta debería ser "¿cómo puedo refactorizar las clases en unidades más pequeñas sin exponer demasiado en público". La respuesta es "mantener esas interfaces esbeltas" (al apegarse al principio de segregación de interfaces, por ejemplo). Ese es el punto 2 de mi humilde opinión en la respuesta de @ DavidArno (supongo que no es necesario que repita eso en otra respuesta).