Sto iniziando a entrare in Unit Testing, Dependancy Injection e tutto ciò che jazz mentre costruisco il mio ultimo progetto ASP.NET MVC.In che modo è possibile testare i controller dell'unità senza un contenitore IoC?
Sono al punto in cui ora vorrei testare i miei controller unitari e ho difficoltà a capire come farlo in modo appropriato senza un contenitore IoC.
Prendiamo ad esempio un semplice controllo:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
Questa classe non è molto unità verificabile a causa della sua istanziazione diretta di SqlQuestionsRepository. Quindi, consente di andare giù per il percorso di iniezione delle dipendenze e fare:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
Questo sembra migliore. Ora posso facilmente scrivere test unitari con un finto IQuestionsRepository. Tuttavia, che cosa sta per istanziare il controller ora? Da qualche parte più avanti la catena di chiamate SqlQuestionRepository dovrà essere istanziata. Sembra che abbia semplicemente spostato il problema altrove, senza esserne liberato.
Ora, so che questo è un buon esempio di dove un contenitore IoC può essere d'aiuto collegando per me le dipendenze dei Controllori e allo stesso tempo mantenendo il controller facilmente controllabile.
La mia domanda è, come si suppone di fare test unitari su cose di questo tipo senza un contenitore IoC?
Nota: non sono contrario ai contenitori IoC e probabilmente andrò presto su quella strada. Tuttavia, sono curioso di sapere quale sia l'alternativa per le persone che non li usano.
@Peter, ottimo suggerimento. Hai mai avuto esperienza con l'utilizzo di contenitori IoC sui tuoi progetti o non ne hai ancora trovato la necessità? – mmcdole
Non ho molta esperienza .NET, la maggior parte del mio lavoro è con Java usando Spring per IoC. È stato molto utile per migliorare la modularità. – Peter
@Peter: questo è praticamente lo schema che utilizzo. Ho postato una risposta che fa la stessa cosa, ma usa alcune caratteristiche del linguaggio C# che tu, essendo un ragazzo Java, potresti non essere a conoscenza. –