Here es una discusión relacionada.
Dejé de hacer referencia a HttpContext.Current
directamente. y el uso de esta clase en su lugar:
public class HttpContextFactory
{
private static HttpContextBase m_context;
public static HttpContextBase Current
{
get
{
if (m_context != null)
return m_context;
if (HttpContext.Current == null)
throw new InvalidOperationException("HttpContext not available");
return new HttpContextWrapper(HttpContext.Current);
}
}
public static void SetCurrentContext(HttpContextBase context)
{
m_context = context;
}
}
y utilizar HttpContextFactory.Current
en lugar de HttpContext.Current
en nuestro código.
Entonces se escribe esto en su ensayo:
HttpContextFactory.SetCurrentContext(GetMockedHttpContext());
donde GetMockedHttpContext() es de here y se ve así:
private System.Web.HttpContextBase GetMockedHttpContext()
{
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(x => x.Identity).Returns(identity.Object);
identity.Setup(id => id.IsAuthenticated).Returns(true);
identity.Setup(id => id.Name).Returns("test");
return context.Object;
}
Se utiliza un mocking framework llamada moq
En su proyecto de prueba debe agregar una referencia a System.Web
y System.Web.Abstractions
, donde HttpContextBase
se define.
También he empezado a hacer esto (reemplazando HttpContext con HttpContextFactory), y realmente me ayuda con Unit Testing (he envuelto estas capacidades en una API que se puede ver aquí http://o2platform.wordpress.com/2011/ 04/05/mocking-httpcontext-httprequest-and-httpresponse-for-unittests-using-moq /) –
No estoy usando moq, así que esto no me llevó al 100%, pero fue útil. Miré los objetos falsos de Stephen Walther en busca de ayuda: http://stephenwalther.com/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context.aspx –