Ich habe meine mvc-Basis-Controller namens DefaultController mit Dependency-Injection-Muster implementiert, um Testfälle zu konstruieren. Beispiel unten:Wie löst man die Abhängigkeit der Base Controller-Abhängigkeit zu Testzwecken?
public class DefaultController : Controller
{
protected readonly ISessionHelper _sessionHelper;
string _thisUserOpenID;
protected IUsersRepository _UserRepository;
...
public DefaultController()
{ } //not for testing
public DefaultController(ISessionHelper session, IUserRepository repo)
{
_sessionHelper=session;
_UserRepository = repo;
}
}
Dann habe ich meinen Controller mit diesem Controller, Homecontroller, Usercontroller etc.
nun einige Testfälle Aufbau ich mich in einer Situation gefunden, wo ich nicht weiß, wie man tatsächlich Verwenden Sie das Injektionsabhängigkeitsmuster.
[TestMethod]
public void Welcome_Message_In_ViewData_Has_Coockie_User_Display_Name()
{
// Below I want to insert FakeRepositories using
//ISessionHelper and so on. but the constructor
//for homecontroller don't have it.
HomeController controller = new HomeController();
Irgendwelche Ideen?
Nur zu beachten - wenn Sie die parameterlosen Konstruktoren loswerden, dann müssen Sie auch Ihre eigenen Controller-Fabriken rollen. – womp
Warum Fabriken? Im obigen Fall injiziert das DI-Framework alles für Sie. Dinge wie ISessionHelper und IUserRepository sollten eine statische Sitzung ausführen und höchstwahrscheinlich keine Werte haben, die Sie übergeben möchten. Alles, was Sie tun müssen, ist Aufruf: var controller = IoC.Resolve() ; und es ist alles für dich gebaut. Injizieren über den Konstruktor bedeutet, dass Sie Variablen über Methodenparameter übergeben oder öffentliche Eigenschaften festlegen müssen (ähnlich wie das Befehlsmuster). –
Bealer