son net mvc los filtros filters cuáles custom asp accion asp.net-mvc unit-testing tdd actionfilterattribute

asp.net-mvc - net - mvc authorization filter



¿Cómo puedo probar un ActionFilter personalizado en ASP.Net MVC? (2)

Así que estoy creando un ActionFilter personalizado que se basa principalmente en este proyecto http://www.codeproject.com/KB/aspnet/aspnet_mvc_restapi.aspx .

Quiero un filtro de acción personalizado que use los encabezados de aceptación de http para devolver JSON o Xml. Una acción típica del controlador se verá así:

[AcceptVerbs(HttpVerbs.Get)] [AcceptTypesAttribute(HttpContentTypes.Json, HttpContentTypes.Xml)] public ActionResult Index() { var articles = Service.GetRecentArticles(); return View(articles); }

El filtro personalizado anula el OnActionExecuted y serializará el objeto (en este artículo de ejemplo) como JSON o Xml.

Mi pregunta es: ¿cómo puedo probar esto?

  1. ¿Qué pruebas escribo? Soy un principiante de TDD y no estoy 100% seguro de lo que debería probar y lo que no debo probar. Se me ocurrió AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson() , AcceptsTypeFilterXml_RequestHeaderAcceptsXml_ReturnsXml() AcceptsTypeFilter_AcceptsHeaderMismatch_ReturnsError406()
  2. ¿Cómo puedo probar un ActionFilter en MVC que está probando los encabezados de aceptación Http?

Gracias.


Me topé con esta publicación de blog que me parece el camino correcto, él usa Moq

Editar

Bien, lo que está haciendo este capítulo es burlarse de HTTPContext , pero también necesitamos configurar un ContentType en la solicitud:

// Mock out the context to run the action filter. var request = new Mock<HttpRequestBase>(); request.SetupGet(r => r.ContentType).Returns("application/json"); var httpContext = new Mock<HttpContextBase>(); httpContext.SetupGet(c => c.Request).Returns(request.Object); var routeData = new RouteData(); // routeData.Values.Add("employeeId", "123"); var actionExecutedContext = new Mock<ActionExecutedContext>(); actionExecutedContext.SetupGet(r => r.RouteData).Returns(routeData); actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object); var filter = new EmployeeGroupRestrictedActionFilterAttribute(); filter.OnActionExecuted(actionExecutedContext.Object);

Nota - no he probado esto yo mismo


Sólo tienes que probar el filtro en sí. Simplemente cree una instancia y llame al método OnActionExecuted() con datos de prueba y luego verifique el resultado. Ayuda a separar el código tanto como sea posible. La mayor parte del trabajo pesado se realiza dentro de la clase CsvResult que se puede probar individualmente. No es necesario probar el filtro en un controlador real. Hacer que el trabajo sea responsabilidad del marco MVC.

public void AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson() { var context = new ActionExecutedContext(); context.HttpContext = // mock an http context and set the accept-type. I don''t know how to do this, but there are many questions about it. context.Result = new ViewResult(...); // What your controller would return var filter = new AcceptTypesAttribute(HttpContentTypes.Json); filter.OnActionExecuted(context); Assert.True(context.Result is JsonResult); }