asp.net-mvc - route - tag helpers asp net core
¿Cómo probar filtros de acción en ASP.NET MVC? (2)
Necesito algunos consejos para esto. Encontré esto y esto , pero todavía soy amable confundido.
Solo quiero simular ActionExecutedContext, pasarlo, dejar que el filtro funcione un poco y verificar el resultado.
¿Alguna ayuda?
Fuente de filtro que puedes encontrar aquí
(Ha cambiado un poco, pero ese no es un punto en este momento).
Entonces, quiero una prueba unitaria, ese filtro RememberUrl es lo suficientemente inteligente como para guardar la URL actual en sesión.
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));
}
}
}
Wrapped Mock <HttpWhatever> para mantener las pruebas limpias.
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! ^^
1) Mocking 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 está inyectando un contenedor de sesión en el constructor público de RememberUrlAttribute.
var rememberUrl = new RememberUrlAttribute(yourSessionWrapper);
rememberUrl.OnActionExecuted(actionExecutedContext.Object);
// Then check what is in your SessionWrapper