Ich fange an, Unit-Testing, Dependancy Injection und all diesen Jazz zu lernen, während ich mein neuestes ASP.NET MVC-Projekt erstelle.Wie können Sie Unit Controller ohne IoC-Container testen?
Ich bin jetzt an dem Punkt, wo ich Unit Controller meine Controller testen möchte und ich habe Schwierigkeiten herauszufinden, wie dies ohne einen IoC-Container geeignet tun.
Nehmen Sie zum Beispiel eine einfache Steuerung:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
Diese Klasse ist nicht sehr Einheit überprüfbare wegen seiner direkten Instanziierung SqlQuestionsRepository. Also, lassen Sie die Dependancy Injection Route gehen und tun Sie:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
Dies scheint besser. Ich kann jetzt Unit-Tests mit einem Pseudo-IQuestionsRepository schreiben. Was wird den Controller jetzt instanziieren? Irgendwo weiter oben muss die Aufrufkette SqlQuestionRepository instanziiert werden. Es scheint, als ob ich das Problem einfach anderswo verschoben, nicht losgeworden bin.
Jetzt weiß ich, dass dies ein gutes Beispiel dafür ist, wo ein IoC-Container Ihnen helfen kann, indem er die Controller-Abhängigkeiten für mich verdrahtet und gleichzeitig meinen Controller leicht testbar hält.
Meine Frage ist, wie soll man Unit-Tests auf Dinge dieser Art tun ohne ein IoC-Container?
Hinweis: Ich bin nicht gegen IoC-Container, und ich werde wahrscheinlich bald diese Straße gehen. Aber ich bin gespannt, was die Alternative für Leute ist, die sie nicht benutzen.
@Peter, sehr guter Vorschlag. Hatten Sie Erfahrungen mit der Verwendung von IoC-Containern in Ihren Projekten oder haben Sie noch keinen Bedarf gefunden? – mmcdole
Ich habe nicht viel .NET Erfahrung, die meisten meiner Arbeit ist mit Java mit Spring für IoC. Es war sehr nützlich für die Verbesserung der Modularität. – Peter
@Peter: Das ist so ziemlich das Muster, das ich verwende. Ich habe eine Antwort gepostet, die dasselbe tut, aber einige C# -Sprachenfunktionen verwendet, die Sie als Java-Typ vielleicht nicht kennen. –