Tengo un accesorio de prueba de unidad en el que estoy tratando de probar un ControllerAction en un controlador ASP.NET MVC que se utiliza para las funciones de membresía en una aplicación web. Estoy intentando burlarme del HttpContext para las pruebas. ControllerAction en prueba realmente establece propiedades en HttpContext, como valores de sesión, valores de Response.Cookies, etc. Esto no es todo el código, pero aquí hay una muestra aproximada de la prueba que estoy tratando de ejecutar :Burlarse de HttpContextBase con Moq
[Test]
public void ValidRegistrationDataSuccessfullyCreatesAndRegistersUser()
{
var context = new Mock<HttpContextBase>() {DefaultValue = DefaultValue.Mock};
context.SetupAllProperties();
var provider = new Mock<MembershipProvider>(new object[] {context.Object});
var controller = new AccountController(context.Object, provider.Object);
// This just sets up a local FormCollection object with valid user data
// in it to use to attempt the registration
InitializeValidFormData();
ActionResult result = controller.Register(_registrationData);
Assert.IsInstanceOfType(typeof(ViewResult), result);
// Here is where I'd like to attempt to do Assertions against properties
// of the HttpContext, like ensuring that a Session object called "User"
// exists, and new auth cookie exists on the Response.Cookies collection.
// So far I've been unable to successfully check the values of those properties.
// I've been unsuccessful in getting those properties setup correctly on my
// mock object so that my ControllerAction can actually *set* their values,
// and that I can make assertions on them afterwards. The above code actually
// generates a StackOverflowException (which I've reported) on the
// context.SetupAllProperties() call. What am I doing wrong, or what do I need
// to do to be able to set and assert on those context properties?
}
No está seguro de lo que estoy haciendo mal, pero me encantaría que si alguien me podría apuntar en la dirección correcta y me muestran cómo configurar este objeto HttpContextBase simulacro de tal manera que mi controlador puede realmente establecer valores en sus propiedades, y puedo hacer afirmaciones sobre esas propiedades para asegurar que mi ControllerAction está haciendo lo que necesito.
¿Me estoy acercando a esto de la manera incorrecta? Sé que los controladores MVC tienen un ControllerContext que puedo usar para establecer valores para Session, etc., pero no puedo imaginar cómo se podría burlar de algo así sin inyectarlo. ¿Hay alguna forma de hacerlo en su lugar? (También necesito poder pasar el contexto a mi proveedor de membresía) ¿Sería ese un mejor enfoque?
Gracias.
Tengo su libro, pero solo lo tengo hace un par de días, así que supongo que todavía no he llegado a esa parte. Si pudieras dirigirme a la sección de ese libro de donde obtuviste el código de muestra, sería fantástico. Muchas gracias. –
Mira el final de ch.9. No lo tengo enfrente, pero parece ser que está mirando la tabla de contenido del libro de Amazon. –
Lo encontré. Eso fue * exactamente * lo que necesitaba. Lo tengo todo funcionando ahora. Muchas gracias. –