2009-06-01 9 views
5

He estado tratando de encontrar información directa sobre esto, pero no he sido capaz de hacerlo; o lo que descubrí ha sido impreciso para mí en cuanto a lo que está pasando, o demasiado específico para lo incorrecto, por ejemplo, un tutorial que encontré para pruebas unitarias de AuthorizeAttribute. (Una tercera alternativa es, por supuesto, que soy demasiado tonto para darme cuenta de que estoy leyendo la información que estoy buscando ... en cuyo caso todavía necesito ayuda, porque soy tonto: P)¿Cómo pruebo UnitTest un ActionFilter personalizado?

me gustaría ser capaz de probar dos cosas:

  1. que un ActionFilter dada se aplica a una acción (para asegurarse de que la acción cumple con los requisitos)
  2. que un ActionFilter dada hace lo que se supone que debe hacer .

Y no tengo ni idea. ¿Alguien podría empujarme en la dirección correcta en cuanto a lo que realmente necesito probar? ¿Qué deberían contener las secciones de Arrange, Act y Assert de las pruebas?


Un pequeño detalle, si no soy lo suficientemente claro:

Tengo un CustomValidationFilter que se supone para comprobar si dos valores del formulario presentados son los mismos, y añadir un ModelStateError si no. Quiero verificar que se añade el error con el mensaje de error correcto si los valores no son los mismos, y que el error es no añadido si los valores son igual (y no nulo).

También tengo una acción Write en un GuestbookController. Quiero verificar que el filtro se aplique a esta acción.

+0

¿Posiblemente podría publicar su código de trabajo para esto? Llegué a crear el atributo, pero estoy teniendo problemas al pasar en un ResultExecutingContext. –

+0

¡Hola, Mark! Mi código está disponible en http://snipplr.com/users/RockinForGod/ –

Respuesta

4

Usando reflejo en su prueba.

var method = typeof(MyController).GetMethod("MyMethod"); 
    var attribute = method.GetCustomAttributes(typeof(CustomValidationFilter),false); 
         .Cast<CustomValidationFilter>() 
         .SingleOrDefault(); 

    Assert.IsNotNull(attribute); 
    Assert.AreEqual("value", atttribute.SomeProperty); 

Cree una prueba unitaria para el método en su clase. Haz una maqueta del filterContext con los datos apropiados y verifica que las variables que el método debe establecer son, de hecho, lo que esperas que sean.

public void AttributeTest() 
{ 
    var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
    var controller = new FakeController(); 
    controller.controllerContext = new ControllerContext(httpContext, new RouteData(), controller); 
    ... 

    attribute.OnActionExecuting(filterContext); 

    Assert... 

} 
+0

¡Muchas gracias! Me tomó un tiempo encontrar la manera de simular todo lo que necesitaba para AttributeTest, pero creo que lo tengo ahora. Si alguien lo encuentra y está interesado, publicaré el código en una edición; solo comente aquí y actualizaré la pregunta con mi código de prueba. –

+0

@Tomas Me interesaría una publicación con lo que hiciste exactamente cuando estaba haciendo una pregunta. Dicho esto, ¿puedes usar MvcContrib.TestHelper para ayudar a burlar los datos requeridos? – ahsteele

+0

@ahsteele: Ha pasado un tiempo desde que trabajé en esto ahora, pero parece que agregué un ejemplo de trabajo a http://snipplr.com/users/RockinForGod/ Si eso no es suficiente para ti, siempre puedes pedirle a un nueva pregunta que detalla qué otras necesidades tienes. –

Cuestiones relacionadas