2012-07-09 26 views
7

Ciao sto facendo qualche test unitario sul mio progetto ASP.Net MVC2. Sto usando il framework Moq. Nel mio LogOnController,FormsAuthentication.SetAuthCookie mocking using Moq

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

} 

In classe 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(); 
     } 
    } 

Il mio problema è come posso evitare l'esecuzione di

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

questa linea. O c'è un modo per MOQ

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

utilizzando Moq quadro senza cambiare il mio progetto ASP.Net MVC2.

+0

Che cos'è SUT (System Under Test) - 'LogOnController' o' FormsAuthenticationService'? Se è il primo, è necessario fornire un falso per 'FormsAuthenticationService' e verificare che il metodo' SignIn' sia chiamato su di esso. Quest'ultimo è più difficile da testare in quanto richiede un attuale 'HttpContext' a cui aggiungere un cookie (a' HttpResponse'). –

+0

Voglio testare LogOnController. Ho provato a simulare FormsService.SignIn (model.UserName, model.RememberMe); in questo modo, var formService = new Mock (); Ma formservice.SignIn non restituisce nulla. Come posso evitare di eseguire quella linea o come deridere quella linea. Non ho idea di come deridere quell'uso di Moq. – Dilma

risposta

9

Iniettare IFormsAuthenticationService come una dipendenza per il vostro LogOnController come questo

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

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

Il primo costruttore è per il quadro in modo che la corretta istanza di IFormsAuthenticationService viene utilizzato in fase di esecuzione.

Ora nei test crea un'istanza di LogonController utilizzando l'altro costruttore passando finto, come di seguito

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

modificare il codice azione per utilizzare il campo privato formsAuthenticationService come di seguito

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

Spero che questo aiuta. Ho lasciato fuori la configurazione di simulazione per te. Fammi sapere se non sei sicuro di come configurarlo.

+0

Grazie Suhas. Non ho idea di dove mettere questo codice da quando sono nuovo su ASP.Net u = Test delle unità. Intendevi che dovrei cambiare il mio LogOnController nel progetto mvc? Si prega di essere abbastanza gentile da spiegare. Grazie in anticipo. – Dilma

+0

Grazie .. Funziona .. Grazie, Suhas. – Dilma

+0

Spero che ora sia chiaro per te. Fammi sapere se hai ancora problemi con questo. – Suhas

Problemi correlati