Tengo dificultades para probar los controladores. Original de mi regulador para la prueba parecía algo como esto:asp.net mvc Cómo probar los controladores correctamente
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
return controller;
}
Esto funciona bien para la mayoría de las pruebas hasta que llegué a la parte Request.IsAjaxRequest()
de código. Entonces tuve que burlarme de HttpContext y HttpRequestBase. Así que mi código a continuación, cambió para parecerse a:
public class FakeHttpContext : HttpContextBase
{
bool _isAjaxRequest;
public FakeHttpContext(bool isAjaxRequest = false)
{
_isAjaxRequest = isAjaxRequest;
}
public override HttpRequestBase Request
{
get
{
string ajaxRequestHeader = "";
if (_isAjaxRequest)
ajaxRequestHeader = "XMLHttpRequest";
var request = new Mock<HttpRequestBase>();
request.SetupGet(x => x.Headers).Returns(new WebHeaderCollection
{
{"X-Requested-With", ajaxRequestHeader}
});
request.SetupGet(x => x["X-Requested-With"]).Returns(ajaxRequestHeader);
return request.Object;
}
}
private IPrincipal _user;
public override IPrincipal User
{
get
{
if (_user == null)
{
_user = new FakePrincipal();
}
return _user;
}
set
{
_user = value;
}
}
}
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
ControllerContext controllerContext = new ControllerContext(new FakeHttpContext(isAjaxRequest), new RouteData(), controller);
controller.ControllerContext = controllerContext;
return controller;
}
ahora su conseguido a esa etapa de mi controlador donde llamo Url.Route
y Url
es nulo. Entonces parece que necesito comenzar a burlar las rutas de mi controlador.
Parece que paso más tiempo buscando en Google cómo falsificar/simular objetos y luego depurar para asegurarme de que mis falsificaciones son correctas en lugar de escribir el código de prueba. ¿Hay una manera más fácil de probar un controlador? Miré el TestControllerBuilder desde MvcContrib, que ayuda con algunos de los problemas pero parece que no hace todo. ¿Hay algo más disponible que haga el trabajo y me permita concentrarme en escribir las pruebas en lugar de escribir burlas?
Gracias
El problema no es con sus pruebas, es con la acción de su controlador. Debe intentar evitar el uso del contexto http en su acción y solo usar las dependencias que suministre en su constructor. Las acciones deben ser muy pequeñas. –