Je commence à m'intéresser aux tests unitaires, à l'injection de dépendances et à tout ce qui concerne le jazz tout en construisant mon dernier projet ASP.NET MVC.Comment pouvez-vous tester vos contrôleurs sans conteneur IoC?
Je suis au point maintenant où je voudrais tester mes contrôleurs unitaires et j'ai de la difficulté à trouver comment le faire de façon appropriée sans un conteneur IoC.
Prenez par exemple un contrôleur simple:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
Cette classe n'est pas unité très testable en raison de sa instanciation directe de SqlQuestionsRepository. Alors, laisse aller dans le sens d'injection et faire Dépendance:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
Cela semble mieux. Je peux maintenant facilement écrire des tests unitaires avec un faux IQuestionsRepository. Cependant, qu'est-ce qui va instancier le contrôleur maintenant? Quelque part plus haut dans la chaîne d'appel, SqlQuestionRepository va devoir être instancié. Il semble que j'ai simplement déplacé le problème ailleurs, sans m'en débarrasser. Maintenant, je sais que c'est un bon exemple où un conteneur IoC peut vous aider en câblant les dépendances des contrôleurs pour moi tout en gardant mon contrôleur facilement testable.
Ma question est, comment est-on supposé faire des tests unitaires sur des choses de cette nature sans un conteneur IoC?
Note: Je ne suis pas contre les conteneurs IoC, et je vais probablement le faire bientôt. Cependant, je suis curieux de savoir quelle est l'alternative pour les personnes qui ne les utilisent pas.
@Peter, très bonne suggestion. Avez-vous déjà utilisé des conteneurs IoC sur vos projets ou n'avez-vous pas encore trouvé de besoin? – mmcdole
Je n'ai pas beaucoup d'expérience .NET, la plupart de mon travail est avec Java en utilisant Spring pour IoC. Cela a été très utile pour améliorer la modularité. – Peter
@Peter: C'est à peu près le modèle que j'utilise. J'ai posté une réponse qui fait la même chose, mais qui utilise des fonctionnalités de langage C# que vous, en tant que Java, n'êtes peut-être pas au courant. –