En este momento hay un debate en nuestro equipo sobre si modificar el diseño del código para permitir la prueba de la unidad es un olor a código, o en qué medida se puede hacer sin ser un olor a código. Esto se debe a que recién estamos comenzando a implementar prácticas que están presentes en casi todas las demás empresas de desarrollo de software.
Específicamente, tendremos un servicio de API web que será muy delgado. Su responsabilidad principal será reunir las solicitudes / respuestas web y llamar a una API subyacente que contenga la lógica empresarial.
Un ejemplo es que planeamos crear una fábrica que devolverá un tipo de método de autenticación. No tenemos necesidad de que herede una interfaz, ya que no anticipamos que sea otra cosa que no sea el tipo concreto que será. Sin embargo, para realizar una prueba unitaria del servicio API web tendremos que burlarnos de esta fábrica.
Esto significa esencialmente que diseñamos la clase de controlador de API web para aceptar DI (a través de su constructor o configurador), lo que significa que estamos diseñando parte del controlador solo para permitir DI e implementando una interfaz que de otro modo no necesitamos, o usamos un marco de terceros como Ninject para evitar tener que diseñar el controlador de esta manera, pero aún tendremos que crear una interfaz.
Algunos en el equipo parecen reacios a diseñar código solo por el simple hecho de realizar pruebas. Me parece que debe haber algún compromiso si espera realizar una prueba unitaria, pero no estoy seguro de cómo calmar sus preocupaciones.
Para ser claros, este es un proyecto nuevo, por lo que no se trata realmente de modificar el código para permitir la prueba de la unidad; se trata de diseñar el código que vamos a escribir para que sea comprobable por unidad.