2008-12-14 14 views
46

Estoy trabajando con una solución ASP.NET MVC de forma controlada por pruebas y deseo iniciar sesión en un usuario de mi aplicación mediante la autenticación de formularios. El código me gustaría terminar con en el controlador ve algo como esto:¿Cómo puedo probar la unidad de mi controlador ASP.NET MVC que usa FormsAuthentication?

FormsAuthentication.SetAuthCookie(userName, false); 

Mi pregunta es ¿cómo puedo escribir una prueba para justificar este código?

¿Hay alguna forma de verificar que se haya llamado al método SetAuthCookie con los parámetros correctos?

¿Hay alguna forma de inyectar un FormsAuthentication falso/falso?

Respuesta

66

Me gustaría empezar escribiendo una interfaz y una clase contenedora que encapsular esta lógica y luego usar la interfaz en mi controlador:

public interface IAuth 
{ 
    void DoAuth(string userName, bool remember); 
} 

public class FormsAuthWrapper : IAuth 
{ 
    public void DoAuth(string userName, bool remember) 
    { 
     FormsAuthentication.SetAuthCookie(userName, remember); 
    } 
} 

public class MyController : Controller 
{ 
    private readonly IAuth _auth; 

    public MyController(IAuth auth) 
    { 
     _auth = auth; 
    } 

} 

Ahora IAuth podrían ser fácilmente burlado en una prueba de unidad y verificar que la el controlador llama a los métodos esperados. Yo NO probaría la unidad en la clase FormsAuthWrapper porque simplemente delega la llamada al FormsAuthentication que hace lo que se supone que debe hacer (Microsoft garantiza :-)).

+2

+1 en esto, no pruebes los marcos de otras personas, solo TU uso de ELLOS. Hacemos lo mismo (similar) en nuestra aplicación (ajustar cosas de FormsAuth, etc.) – chadmyers

+18

* suspiro * ¡Microsoft está tan orgulloso de que este marco sea TAN comprobable! Esperaba que hubiera alguna forma de burlarse de esto sin envolver. Adivina que no :( – maz

+6

El problema no es que el marco no sea comprobable ... el problema es que la clase FormsAuthentication es anterior al diseño de prueba de la unidad de MVC. Como Darin ha mencionado, la mejor forma de abordar esto es desvincular el Controlador de la clase con los métodos estáticos usando una interfaz . – Jesse

Cuestiones relacionadas