Empiezo a adentrarme en Pruebas Unitarias, Inyección de Dependencia y todo ese jazz mientras construyo mi último proyecto ASP.NET MVC.¿Cómo puede probar la unidad sus controladores sin un contenedor IoC?
Ahora llego al punto en el que me gustaría poner a prueba mis controladores y estoy teniendo dificultades para descubrir cómo hacerlo de manera apropiada sin un contenedor IoC.
Tomemos por ejemplo un controlador simple:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
Esta clase no es muy comprobable unidad debido a su instanciación directa de SqlQuestionsRepository. Por lo tanto, vamos a ir por la ruta de Inyección de Dependencia y hacer:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
Esto parece mejor. Ahora puedo escribir fácilmente pruebas unitarias con un simulador IQuestionsRepository. Sin embargo, ¿qué va a crear una instancia del controlador ahora? En algún lugar más arriba de la cadena de llamadas SqlQuestionRepository tendrá que crearse una instancia. Parece que simplemente cambié el problema a otra parte, no me deshice de él.
Ahora, sé que este es un buen ejemplo de cómo un contenedor de IoC puede ayudarlo al conectar las dependencias de los Controladores mientras que, al mismo tiempo, mantengo mi controlador fácilmente comprobable por unidad.
Mi pregunta es, ¿cómo se supone que uno haga pruebas unitarias en cosas de esta naturaleza sin un contenedor IoC?
Nota: No me opongo a los contenedores de IoC, y es probable que pase por ese camino pronto. Sin embargo, tengo curiosidad por saber cuál es la alternativa para las personas que no los usan.
@Peter, muy buena sugerencia. ¿Ha tenido alguna experiencia con el uso de contenedores IoC en sus proyectos o aún no ha encontrado una necesidad? – mmcdole
No tengo mucha experiencia con .NET, la mayor parte de mi trabajo es con Java utilizando Spring para IoC. Ha sido muy útil para mejorar la modularidad. – Peter
@Peter: este es más o menos el patrón que uso. Publiqué una respuesta que hace lo mismo, pero usa algunas características del lenguaje C# de las que usted, como persona de Java, podría no estar al tanto. –