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?
fuente
GenericIdentity
constructor,IsAuthenticated
devolverá falsoHttpContextBase
, que se pueden burlar. No es necesario utilizar la solución alternativa que publiqué si está utilizando MVC. Si continúas con esto, probablemente necesites ejecutar el código que publiqué antes de crear el controlador.Debajo de Test Init también hará el trabajo.
fuente
System.Web
en su proyecto de prueba?Sé que este es un tema más antiguo, sin embargo, burlarnos de una aplicación MVC para pruebas unitarias es algo que hacemos de manera muy regular.
Solo quería agregar mis experiencias Burlándose de una aplicación MVC 3 usando Moq 4 después de actualizar a Visual Studio 2013. Ninguna de las pruebas unitarias funcionaba en modo de depuración y el HttpContext mostraba "no se pudo evaluar la expresión" cuando se trataba de mirar las variables .
Resulta que Visual Studio 2013 tiene problemas para evaluar algunos objetos. Para que la depuración de aplicaciones web simuladas volviera a funcionar, tuve que marcar el "Usar el modo de compatibilidad administrada" en Herramientas => Opciones => Depuración => Configuración general.
Generalmente hago algo como esto:
E iniciando el contexto así
Y llamando al Método en el controlador directamente
fuente
Si el tercero de su aplicación redirige internamente, es mejor burlarse de HttpContext de la siguiente manera:
fuente