How to solve base Controller dependency injection for testing purposes?

.net, asp.net-mvc, c#

Solution

Your HomeController needs to have a matching "injectable" constructor, which would then call the base constructor.

public HomeController(ISessionHelper session, IUserRepository repo)
  : base(session, repo)
    {

    }

Now, in your test, you would create your HomeController using that constructor, and pass in a mocked up session and user repository. Speaking of mocking, you might also be interested in Scott Hanselman's MvcMockHelpers classes, with code for many popular mocking frameworks.

Problem

I have implemented my mvc base controller called DefaultController using dependency injection pattern in order to be able to construct test cases. Example below: ``` 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; } } ``` Then I have my controllers using this controller, homecontroller, usercontroller, etc. Now, building some test cases I found myself in a situation where I don't know how to actually use the injection dependency pattern. ``` [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(); ``` Any ideas?

Original source