2009-12-09 6 views
26

He buscado stackoverflow y busqué en Google un par de horas y todavía no encontré ninguna solución para mi problema "trivial".¿Cómo compruebo la unidad de un método de controlador que tiene aplicado el atributo [Autorizar]?

Si escribe la prueba de unidad para su [Authorize] ActionResult filtrado, ¿cómo se resuelve el problema de que el usuario está autenticado?

que tienen una gran cantidad de ActionResult métodos que se filtran con [Authorize] y quiero probar todos mis ActionResult métodos sin tener en cuenta si se filtran con [Authorize] o no.

Un simple ejemplo de lo que quiero decir:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

A partir de ahora las pruebas ni siquiera alcanzaron el método ActionResult debido a la [Autorizar] filtro, excepción lanzada es: System.NullReferenceException: Object reference not set to an instance of an object.

+1

Hay algo que no nos estás mostrando. La prueba que muestre no ejecutará * ningún * filtro de acción. Tal vez tengas un código que lo hará, pero no está en tu pregunta. ¿Qué tal la pila de llamadas completa para el error, para empezar? –

Respuesta

25

Usted necesita burlarse de un contexto para su controlador. Intente utilizar Moq

Su arreglos sería el siguiente aspecto:

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

Usted debe ser capaz de hacer su continuación, Ley & Assert.

Si aún no lo ha hecho, le recomiendo mirar a través de NerdDinner como un ejemplo de sitio MVC.

+0

Impresionante, esto funcionó sin problemas ... Muchas gracias – Webking

+0

Podría argumentar que no es necesario realmente probar esto en absoluto. El atributo ya está bien probado por el equipo que escribió ASP.NET MVC. Puede descargar la fuente y ver por usted mismo. –

+8

No es para probar el atributo '[Authorized]', es para evitarlo probar los métodos 'ActionResult' – AndyMcKenna

Cuestiones relacionadas