Estoy intentando escribir una prueba unitaria para mi controlador único para verificar si una vista se devolvió correctamente, pero este controlador tiene un controlador base que accede a HttpContext.Current.Session. Cada vez que creo una nueva instancia de mi controlador, se llama al constructor del controlador base y la prueba falla con una excepción de puntero nulo en HttpContext.Current.Session. Aquí está el código:Controlador de prueba de unidad ASP.NET MVC con HttpContext
public class BaseController : Controller
{
protected BaseController()
{
ViewData["UserID"] = HttpContext.Current.Session["UserID"];
}
}
public class IndexController : BaseController
{
public ActionResult Index()
{
return View("Index.aspx");
}
}
[TestMethod]
public void Retrieve_IndexTest()
{
// Arrange
const string expectedViewName = "Index";
IndexController controller = new IndexController();
// Act
var result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result, "Should have returned a ViewResult");
Assert.AreEqual(expectedViewName, result.ViewName, "View name should have been {0}", expectedViewName);
}
Cualquier ideas sobre cómo burlarse (usando Moq) la Sesión que se accede en el controlador de base de lo que la prueba en el controlador descendiente funcionará?
Si utilizo el enfoque del filtro acción que tendría entonces para decorar cada acción con este atributo y con cerca de 400 acciones que ISN es factible – amurra
@ user299592: No, no lo harías. Puede aplicarlo a nivel de clase (según el ejemplo) y lo aplicará a cada acción de esa clase. Si crees que va a ser más esfuerzo que burlarse de un contexto para cada prueba en cada acción (algunas o ninguna de las cuales usa realmente el campo que estás configurando en el constructor), es suficiente. – pdr
Su correcto No lo vi en el nivel de clase, pero ¿no se llamaría todavía al filtro de acción al crear el objeto del controlador? – amurra