Pergunta

Eu estou trabalhando em uma aplicação ASP.NET MVC, e estou tentando escrever alguns testes de unidade contra ações do controlador, alguns dos quais manipulam propriedades na HttpContext, como Session, Request.Cookies, Response.Cookies, etc. Eu estou tendo alguns problemas para descobrir como "Organizar, Agir, Assert" ... Eu posso ver Organizar e Assert ... mas eu estou tendo dificuldade para descobrir como a "Lei" em propriedades de uma zombou HttpContextBase quando todos de suas propriedades só tem getters. Eu não posso set qualquer coisa no meu contexto zombado de dentro de minhas ações de controlador ... por isso não parece muito útil. Eu sou bastante novo para zombando, então eu tenho certeza que há algo que eu estou perdendo, mas parece-me lógico que eu deveria ser capaz de criar um objeto de simulação que eu posso usar no contexto de ações do controlador de teste onde eu pode realmente set valores de propriedade, e depois Assert que eles são ainda o que eu defini-los, ou algo parecido. O que eu estou ausente?

    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;
    }
Foi útil?

Solução

Ei, eu acho que você está apenas experimentando um pouco de uma desconexão aqui, não é grande coisa. O que você descreve é ??100% possível.

Eu não sou inteiramente positiva sobre por que você não pode definir propriedades em seus Mocks, mas se você postar o código completo para o teste eu ficaria feliz em passar por isso com você. Apenas fora do topo da minha cabeça, eu vou sugerir duas coisas:

  1. Há uma diferença entre Setup () e SetupProperty (). SetupProperty () é provavelmente o que você está depois, se você quiser rastrear os valores das propriedades, em vez de apenas obter um valor de uma vez.

  2. Como alternativa tentar chamar SetupAllProperties () em qualquer simulação que você precisa definir uma propriedade em.

Verifique a Moq quickstart , bem como para alguns exemplos.

Outras dicas

Não tenho certeza se alguém estiver interessado, mas eu traduzi o MOQ FakeHttpContext para um usando Rhino Mocks (minha arma de escolha).

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;

        }

com um uso em uma unidade de teste de

_httpContext = FakeHttpContext();
var cookieManager = new CookieManager(_httpContext);
string username = cookieManager.GetUsername();
_httpContext.AssertWasCalled(hc => { var dummy = hc.Request; });
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top