He implementado mi controlador base de mvc llamado DefaultController usando el patrón de inyección de dependencia para poder construir casos de prueba. Ejemplo a continuación:¿Cómo resolver la inyección de dependencia del controlador base para fines de prueba?
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;
}
}
Entonces tengo mis controladores que utilizan este controlador, HomeController, UserController, etc.
Ahora, la construcción de algunos casos de prueba, me encontré en una situación en la que no sé cómo en realidad usa el patrón de dependencia de inyección.
[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();
¿Alguna idea?
Solo para tener en cuenta: si se deshace de los constructores sin parámetros, entonces también necesita desplegar sus propias fábricas de Controladores. – womp
¿Por qué las fábricas? En el caso anterior, el marco DI inyecta todo por ti. Cosas como ISessionHelper y IUserRepository deberían ejecutarse en una sesión estática, y lo más probable es que no tengan ningún valor que desee pasar. Todo lo que tiene que hacer es llamar a var controller = IoC.Resolve() ; y está todo construido para ti. Al inyectar a través del constructor, significa que debe pasar las variables a través de los parámetros del método o establecer las propiedades públicas (muy parecido al patrón de comando). –
Bealer