El problema que describes es muy real y muy fácil de encontrar cuando TDD'ing. En general, puede decir que no está probando el comportamiento incidental en sí mismo, que es un problema, sino más bien si toneladas de pruebas dependen de ese comportamiento incidental.
El principio DRY se aplica tanto al código de prueba como al código de producción. Eso a menudo puede ser una buena guía al escribir el código de prueba. El objetivo debe ser que todo el comportamiento 'incidental' que especifique en el camino esté aislado, de manera que solo unas pocas pruebas de todo el conjunto de pruebas lo utilicen. De esta forma, si necesita refaccionar ese comportamiento, solo necesita modificar algunas pruebas en lugar de una gran parte de todo el conjunto de pruebas.
Esto se logra mejor mediante el uso copioso de interfaces o clases abstractas como colaboradores, porque esto significa que obtiene un bajo nivel de acoplamiento.
Aquí hay un ejemplo de lo que quiero decir. Supongamos que tiene algún tipo de implementación de MVC donde un Controlador debe devolver una Vista. Supongamos que tenemos un método de este tipo en un BookController:
public View DisplayBookDetails(int bookId)
La aplicación debe utilizar un IBookRepository inyectada para conseguir el libro de la base de datos y luego convertir que a una vista de ese libro. Podría escribir muchas pruebas para cubrir todos los aspectos del método DisplayBookDetails, pero también podría hacer otra cosa:
Defina una interfaz IBookMapper adicional e inyéctela en el BookController además del IBookRepository. La aplicación del método podría entonces ser algo como esto:
public View DisplayBookDetails(int bookId)
{
return this.mapper.Map(this.repository.GetBook(bookId);
}
Obviamente, esto es un ejemplo demasiado simplista, pero el punto es que ahora se puede escribir una serie de pruebas para su aplicación IBookMapper real, lo que significa que cuando Si prueba el método DisplayBookDetails, puede usar un Stub (mejor generado por un marco simulado dinámico) para implementar la asignación, en lugar de tratar de definir una relación frágil y compleja entre un objeto del Dominio del Libro y cómo se mapea.
El uso de un IBookMaper es definitivamente un detalle de implementación incidental, pero si usa un contenedor SUT Factory o mejor aún un contenedor de burla automática, la definición de ese comportamiento incidental está aislada, lo que significa que si más adelante decide refactorizar la implementación, puede hacerlo cambiando solo el código de prueba en algunos lugares.
Creo que ayudaría si incluyera un ejemplo. Definitivamente una pregunta válida, pero podría interpretarse de diferentes maneras. –