2009-06-29 11 views
14

Ho bisogno di alcuni suggerimenti per questo. Trovato this e this, ma sono ancora un po 'confuso.Come testare i filtri azione in ASP.NET MVC?

Voglio solo prendere in giro ActionExecutedContext, passarlo, lasciare che il filtro funzioni un po 'e controllare il risultato.

Qualsiasi aiuto?

Fonte del filtro è possibile trovare here
(è cambiato un po ', ma non è un punto al momento).

Quindi, voglio test di unità, che il filtro RememberUrl sia abbastanza intelligente da salvare l'URL corrente nella sessione.

+0

ActionExecutedContext deriva da ControllerContext. La risposta di Haacked riguarda esattamente il deridere ControllerContext - http://stackoverflow.com/questions/32640/mocking-asp-net-mvc-controller-context/32672#32672. In cosa esattamente sei confuso? –

+0

Non l'ho ancora fatto. Immagino che mi manchi la conoscenza delle operazioni interne di mdf asp.net. :) –

+0

Quindi pubblica il tuo codice. Cercheremo di aiutare :) –

risposta

11

1) Mocking Request.Url in ActionExecutedContext:

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(r => r.HttpMethod).Returns("GET"); 
request.SetupGet(r => r.Url).Returns(new Uri("http://somesite/action")); 

var httpContext = new Mock<HttpContextBase>(); 
httpContext.SetupGet(c => c.Request).Returns(request.Object); 

var actionExecutedContext = new Mock<ActionExecutedContext>(); 
actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object); 

2) Supponiamo che si sta iniettando sessione involucro nel costruttore pubblica del vostro RememberUrlAttribute.

var rememberUrl = new RememberUrlAttribute(yourSessionWrapper); 

rememberUrl.OnActionExecuted(actionExecutedContext.Object); 

// Then check what is in your SessionWrapper 
+0

rememberUrl non hanno il metodo "ActionExecutedCotnext". –

+0

È OnActionExecuted. Ad ogni modo - sembra che finalmente l'ho capito. Basta prendere in giro correttamente httpContext. Grazie ancora - apprezzo molto il tuo aiuto. :) –

+0

....... Risolto :) –

3

questo è il risultato:

#region usages 

using System; 
using System.Collections.Specialized; 
using System.Web; 
using System.Web.Mvc; 
using x.TestBase; 
using x.UI.y.Infrastructure.Enums; 
using x.UI.y.Infrastructure.Filters; 
using x.UI.y.Test.Mocks; 
using Moq; 

//considering switch to NUnit... :D 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

#endregion 

namespace x.UI.y.Test.Unit.Infrastructure.Filters 
{ 
    [TestClass] 
    public class RememberUrlTester : TesterBase 
    { 
     private static HttpContextBaseMock _context = 
      new HttpContextBaseMock(); 
     private static ActionExecutedContextMock _actionContext = 
      new ActionExecutedContextMock(_context.Object); 

     [TestMethod] 
     //"Can save url in session" (i prefer test names in my own language :) 
     public void SpeejPieglabaatUrlSesijaa() 
     { 
      //Arrange 
      const string _url = "http://www.foo.bar/foo?bar=bar"; 
      _context.RequestMock.SetUrl(_url);  
      var filter = new RememberUrlAttribute(); 

      //Act 
      filter.OnActionExecuted(_actionContext.Object); 

      //Assert 
      _context.SessionMock.Verify 
       (m => m.Add(SessionKey.PreviousUrl.ToString(), _url)); 
     } 
    } 
} 

Avvolto Mock <HttpWhatever> per mantenere test pulito.

Sono sicuro che le cose possono essere fatte meglio, ma penso che sia un ottimo inizio e mi sento molto eccitato.

Finalmente quel mostro HttpContext è sotto controllo! ^^

+0

Se funziona per te, è bello, ma gli xUnit hanno scritto sul perché lo hanno creato, che vale la pena leggere: http://xunit.codeplex.com/wikipage ? title = WhyDidWeBuildXunit & referringTitle = Home – ZeroBugBounce

+0

@richdiet questo era molto tempo fa. Preferirei xUnit al giorno d'oggi. –

Problemi correlati