2009-06-29 14 views
14

Necesito algunos consejos para esto. Encontraron this y this, pero aún así me siento confundido.¿Cómo probar filtros de acción en ASP.NET MVC?

Solo quiero simular ActionExecutedContext, pasarlo, dejar que el filtro funcione un poco y comprobar el resultado.

¿Algún ayuda?

Fuente de filtro puede encontrar here
(ha cambiado un poco, pero ese no es un punto por el momento).

Entonces, quiero una prueba de unidad, ese filtro RememberUrl es lo suficientemente inteligente como para guardar la URL actual en sesión.

+0

ActionExecutedContext se deriva de ControllerContext. La respuesta de Haacked es exactamente sobre burlarse de ControllerContext - http://stackoverflow.com/questions/32640/mocking-asp-net-mvc-controller-context/32672#32672. ¿En qué estás exactamente confundido? –

+0

Simplemente no lo he hecho todavía. Supongo que me falta conocimiento sobre el trabajo interno de asp.net mvc. :) –

+0

Luego publica tu código. Intentaremos ayudar :) –

Respuesta

11

1) que imita Request.Url en 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) Supongamos que se está inyectando envoltorio sesión en el constructor pública de su RememberUrlAttribute.

var rememberUrl = new RememberUrlAttribute(yourSessionWrapper); 

rememberUrl.OnActionExecuted(actionExecutedContext.Object); 

// Then check what is in your SessionWrapper 
+0

rememberUrl no tiene el método "ActionExecutedCotnext". –

+0

Es OnActionExecuted. De todos modos, parece que finalmente lo conseguí. Solo necesita burlarse de httpContext. Gracias de nuevo. Realmente aprecio tu ayuda. :) –

+0

....... Reparado :) –

3

Este es el resultado:

#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)); 
     } 
    } 
} 

envuelta Mock <HttpWhatever> para mantener limpia pruebas.

Estoy seguro de que las cosas se pueden hacer mejor, pero creo que es un gran comienzo y me siento bastante emocionado.

¡Finalmente ese monstruo de HttpContext está bajo control! ^^

+0

Si funciona para usted, es genial, pero la gente de xUnit escribió sobre por qué lo crearon, que vale la pena leer: http://xunit.codeplex.com/wikipage ? title = WhyDidWeBuildXunit & sayingTítulo = Inicio – ZeroBugBounce

+0

@richdiet este fue hace mucho tiempo. Preferiría xUnit hoy en día. –

Cuestiones relacionadas