2011-12-14 16 views
14

? Así que estoy creando un ActionFilter personalizado que se basa principalmente en este proyecto http://www.codeproject.com/KB/aspnet/aspnet_mvc_restapi.aspx.¿Cómo puedo probar un filtro ActionFilter personalizado en ASP.Net MVC

Quiero un filtro de acción personalizado que use los encabezados http accept para devolver JSON o Xml. Una acción del controlador típico tendrá este aspecto:

[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 tendrá serializar el objeto (en este ejemplo artículos), ya sea como JSON o XML.

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

  1. ¿Qué pruebas debo escribir? Soy un novato de TDD y no estoy 100% seguro de lo que debería probar y qué no probar. Creé AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson(), AcceptsTypeFilterXml_RequestHeaderAcceptsXml_ReturnsXml() y AcceptsTypeFilter_AcceptsHeaderMismatch_ReturnsError406().
  2. ¿Cómo puedo probar un ActionFilter en MVC que está probando los Http Accept Headers?

Gracias.

Respuesta

21

Solo necesita probar el filtro. Simplemente cree una instancia y llame al método OnActionExecuted() con los datos de prueba y luego verifique el resultado. Ayuda a separar el código tanto como sea posible. Here's un ejemplo que he escrito. La mayor parte del trabajo pesado se realiza dentro de la clase CsvResult que se puede probar individualmente. No necesita probar el filtro en un controlador real. Hacer que funcione es responsabilidad del framework 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); 
} 
9

Me tropecé con this blog post que parece el camino correcto para mí, él usa Moq

Editar

Bueno por lo que lo que este capítulo está haciendo es burlarse del HTTPContext, pero también necesitamos para 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 lo he probado yo mismo

+0

¿Puede resumir los puntos principales aquí? –

Cuestiones relacionadas