Pregunta

Estoy trabajando en una aplicación ASP.NET MVC, y estoy tratando de escribir algunas pruebas unitarias contra acciones del controlador, algunas de las cuales manipulan propiedades en el HttpContext, como Session, Request.Cookies, Response.Cookies, etc. Tengo algunos problemas para descubrir cómo "Organizar, Actuar, Afirmar" ... Puedo ver Organizar y Afirmar ... pero tengo problemas para descubrir cómo "Actuar". en propiedades de un HttpContextBase simulado cuando todas sus propiedades solo tienen captadores. No puedo configurar nada en mi contexto burlado desde las acciones de mi controlador ... por lo que no parece muy útil. Soy bastante nuevo en burlarse, así que estoy seguro de que hay algo que me falta, pero me parece lógico que pueda crear un objeto simulado que pueda usar en el contexto de probar las acciones del controlador donde en realidad puede establecer valores de propiedad, y luego afirmar que siguen siendo lo que yo configuré, o algo así. ¿Qué me estoy perdiendo?

    public static HttpContextBase GetMockHttpContext()
    {
        var requestCookies = new Mock<HttpCookieCollection>();
        var request = new Mock<HttpRequestBase>();
        request.Setup(r => r.Cookies).Returns(requestCookies.Object);
        request.Setup(r => r.Url).Returns(new Uri("http://example.org"));

        var responseCookies = new Mock<HttpCookieCollection>();
        var response = new Mock<HttpResponseBase>();
        response.Setup(r => r.Cookies).Returns(responseCookies.Object);

        var context = new Mock<HttpContextBase>();

        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(new Mock<HttpSessionStateBase>().Object);
        context.Setup(ctx => ctx.Server).Returns(new Mock<HttpServerUtilityBase>().Object);
        context.Setup(ctx => ctx.User).Returns(GetMockMembershipUser());
        context.Setup(ctx => ctx.User.Identity).Returns(context.Object.User.Identity);
        context.Setup(ctx => ctx.Response.Output).Returns(new StringWriter());

        return context.Object;
    }
¿Fue útil?

Solución

Oye, creo que estás experimentando un poco de desconexión aquí, no es gran cosa. Lo que describe es 100% posible.

No estoy del todo seguro de por qué no puede establecer propiedades en sus simulacros, pero si publica el código completo para su prueba, estaré encantado de revisarlo con usted. Justo en la parte superior de mi cabeza, sugeriré dos cosas:

  1. Hay una diferencia entre Setup () y SetupProperty (). SetupProperty () es probablemente lo que busca si desea realizar un seguimiento de los valores de las propiedades, en lugar de simplemente obtener un valor de ellos una vez.

  2. Alternativamente intente llamar a SetupAllProperties () en cualquier simulación en la que necesite establecer una propiedad.

Compruebe el inicio rápido de Moq también para ver algunos ejemplos.

Otros consejos

No estoy seguro de si alguien está interesado, pero he traducido el Moq FakeHttpContext a uno que usa Rhino Mocks (mi arma de elección).

public static HttpContextBase FakeHttpContext()
        {
            var httpContext = MockRepository.GenerateMock<HttpContextBase>();
            var request = MockRepository.GenerateMock<HttpRequestBase>();
            var response = MockRepository.GenerateMock<HttpResponseBase>();
            var session = MockRepository.GenerateMock<HttpSessionStateBase>();
            var server = MockRepository.GenerateMock<HttpServerUtilityBase>();
            var cookies = new HttpCookieCollection();
            response.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Url).Return(new Uri("http://test.com"));

            httpContext.Stub(x => x.Server).Return(server);
            httpContext.Stub(x => x.Session).Return(session);
            httpContext.Stub(x => x.Request).Return(request);
            httpContext.Stub(x => x.Response).Return(response);
            var writer = new StringWriter();
            var wr = new SimpleWorkerRequest("", "", "", "", writer);
            System.Web.HttpContext.Current = new System.Web.HttpContext(wr);
            return httpContext;

        }

con un uso en una Prueba de Unidad de

_httpContext = FakeHttpContext();
var cookieManager = new CookieManager(_httpContext);
string username = cookieManager.GetUsername();
_httpContext.AssertWasCalled(hc => { var dummy = hc.Request; });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top