2012-07-09 24 views
7

Hola, estoy haciendo algunas pruebas de unidad en mi proyecto ASP.Net MVC2. Estoy usando el framework Moq. En mi LogOnController,FormsAuthentication.SetAuthCookie burlando usando Moq

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl = "") 
{ 
    FormsAuthenticationService FormsService = new FormsAuthenticationService(); 
    FormsService.SignIn(model.UserName, model.RememberMe); 

} 

En la clase FormAuthenticationService,

public class FormsAuthenticationService : IFormsAuthenticationService 
    { 
     public virtual void SignIn(string userName, bool createPersistentCookie) 
     { 
      if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot  be null or empty.", "userName"); 
      FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
     } 
     public void SignOut() 
     { 
      FormsAuthentication.SignOut(); 
     } 
    } 

Mi problema es cómo puedo evitar la ejecución de

FormsService.SignIn(model.UserName, model.RememberMe); 

esta línea. O ¿hay alguna manera de MOQ

FormsService.SignIn(model.UserName, model.RememberMe); 

usando marco Moq sin cambiar mi proyecto ASP.Net MVC2.

+0

¿Qué es el SUT (Sistema bajo prueba) - 'LogOnController' o' FormsAuthenticationService'? Si es el primero, se debe suministrar un falso para el 'FormsAuthenticationService' y usted debe verificar que se llame al método' SignIn'. Este último es más difícil de probar por unidad, ya que requiere un 'HttpContext' actual al cual agregar una cookie (al' HttpResponse'). –

+0

Quiero probar LogOnController. Traté de burlar FormsService.SignIn (model.UserName, model.RememberMe); de esta manera, var formService = new Mock (); Pero formservice.SignIn no devuelve nada. ¿Cómo puedo evitar ejecutar esa línea o cómo burlar esa línea? No tengo idea de cómo simular eso usando Moq. – Dilma

Respuesta

9

Inyectar IFormsAuthenticationService como una dependencia a su LogOnController como esto

private IFormsAuthenticationService formsAuthenticationService; 
public LogOnController() : this(new FormsAuthenticationService()) 
{ 
} 

public LogOnController(IFormsAuthenticationService formsAuthenticationService) : this(new FormsAuthenticationService()) 
{ 
    this.formsAuthenticationService = formsAuthenticationService; 
} 

El primer constructor es para el marco para que la instancia correcta de IFormsAuthenticationService se utiliza en tiempo de ejecución.

Ahora en sus pruebas de crear una instancia de LogonController utilizando el otro constructor pasando maqueta de la siguiente manera

var mockformsAuthenticationService = new Mock<IFormsAuthenticationService>(); 
//Setup your mock here 

cambiar el código de acción para usar el campo privado formsAuthenticationService como a continuación

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl = "") 
{ 
    formsAuthenticationService.SignIn(model.UserName, model.RememberMe); 
} 

Esperanza esta ayuda He omitido la configuración simulada para ti. Avísame si no estás seguro de cómo configurarlo.

+0

Gracias Suhas. No tengo idea de dónde poner este código ya que soy nuevo en ASP.Net u = Prueba unitaria. ¿Querías decir que debería cambiar mi LogOnController en el proyecto mvc? Por favor tenga la amabilidad de explicar. Gracias por adelantado. – Dilma

+0

Gracias ... Funciona ... Gracias Suhas. – Dilma

+0

Espero que esté claro para ti ahora. Avíseme si todavía tiene problemas con esto. – Suhas

Cuestiones relacionadas