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?
- ¿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()
- ¿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);
}