Estoy tratando de agregar pruebas unitarias a una aplicación ASP.NET MVC que he construido. En mis pruebas unitarias utilizo el siguiente código:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Con los siguientes ayudantes para burlarse del contexto del controlador:
public static class FakeControllerContext {
public static HttpContextBase FakeHttpContext(string username) {
var context = new Mock<HttpContextBase>();
context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));
if (!string.IsNullOrEmpty(username))
context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, string username = null) {
var httpContext = FakeHttpContext(username);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}
}
Esta clase de prueba hereda de una clase base que tiene lo siguiente:
[TestInitialize]
public void Init() {
...
}
Dentro de este método, llama a una biblioteca (sobre la que no tengo control) que intenta ejecutar el siguiente código:
HttpContext.Current.User.Identity.IsAuthenticated
Ahora probablemente puedas ver el problema. He configurado el HttpContext falso contra el controlador, pero no en este método básico de Init. La prueba / burla de la unidad es muy nueva para mí, así que quiero asegurarme de hacerlo bien. ¿Cuál es la forma correcta para mí de simular el HttpContext para que se comparta entre mi controlador y cualquier biblioteca que se llame en mi método Init?