2012-06-28 5 views
5

Sto scrivendo un test unitario e il metodo controller lancia un'eccezione perché HttpContext/ControllerContext è null. Non ho bisogno di affermare nulla da HttpContext, basta che non sia NULL. Ho fatto ricerche e credo che Moq sia la risposta. Ma tutti i campioni che ho visto non mi hanno aiutato molto. Non ho bisogno di fare niente di speciale, solo per deridere l'httpcontext. Indicami nella giusta direzione!Come simulare httpcontext in modo che non sia nullo da un test di unità?

+1

Penso che questo post ti aiuterà. http://stackoverflow.com/questions/542132/mocking-a-httpcontext-response-output-with-moq –

+1

Got It! Questo post ha aiutato molto: http://www.emadibrahim.com/2008/04/04/unit-test-linq-to-sql-in-aspnet-mvc-with-moq/ Realizzato una classe HttpContextFactory con due metodi. Un httpcontext beffardo e l'altra impostazione contesto controller corrente per i dati derisi. – TheFlyingCircus

+0

Dovresti inserire alcuni esempi di codice che descrivono la tua soluzione qui come risposta alla tua domanda. Assicurati di accettarlo quando puoi. –

risposta

6

Ha ottenuto queste due funzioni da here in una classe;

public static class HttpContextFactory 
    { 
     public static void SetFakeAuthenticatedControllerContext(this Controller controller) 
     { 

      var httpContext = FakeAuthenticatedHttpContext(); 
      ControllerContext context = 
      new ControllerContext(
      new RequestContext(httpContext, 
      new RouteData()), controller); 
      controller.ControllerContext = context; 

     } 


     private static HttpContextBase FakeAuthenticatedHttpContext() 
     { 
      var context = new Mock<HttpContextBase>(); 
      var request = new Mock<HttpRequestBase>(); 
      var response = new Mock<HttpResponseBase>(); 
      var session = new Mock<HttpSessionStateBase>(); 
      var server = new Mock<HttpServerUtilityBase>(); 
      var user = new Mock<IPrincipal>(); 
      var identity = new Mock<IIdentity>(); 

      context.Setup(ctx => ctx.Request).Returns(request.Object); 
      context.Setup(ctx => ctx.Response).Returns(response.Object); 
      context.Setup(ctx => ctx.Session).Returns(session.Object); 
      context.Setup(ctx => ctx.Server).Returns(server.Object); 
      context.Setup(ctx => ctx.User).Returns(user.Object); 
      user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
      identity.Setup(id => id.IsAuthenticated).Returns(true); 
      identity.Setup(id => id.Name).Returns("a.ali174"); 

      return context.Object; 
     } 


    } 

Dal test dell'unità li ho chiamati come tali;

HttpContextFactory.SetFakeAuthenticatedControllerContext(controller); 

Assicurarsi di aver Moq installato nel progetto test:

Install-Package Moq 
0

So che questo è un argomento vecchio, però derisione un'applicazione MVC per i test unitari è qualcosa che facciamo su base molto regolare.

Volevo solo aggiungere le mie esperienze Mocking di un'applicazione MVC 3 utilizzando Moq 4 dopo l'aggiornamento a Visual Studio 2013. Nessuno dei test di unità funzionava in modalità di debug e HttpContext mostrava "Impossibile valutare l'espressione" durante il tentativo di sbirciare le variabili.

Risultato studio visivo 2013 ha problemi nella valutazione di alcuni oggetti. Per eseguire nuovamente il debugging delle applicazioni Web fittate, dovevo controllare "Usa modalità di compatibilità gestita" in Strumenti => Opzioni => Debug => Impostazioni generali.