Pergunta

Eu tenho usado a classe MVCMockHelpers encontrada em Blog de Hanselman por passar em um httpcontext ridicularizado. Nós o estendemos um pouco para adicionar alguns dados de autenticação de que precisávamos e, na maioria das vezes, isso foi ótimo.

A questão que estamos tendo é que o contexto que estamos dando ao controlador tem um valor nulo no httpcontext.Response.Output, que está fazendo com que algumas exceções sejam lançadas. Não tenho certeza do que adicionar para fazer isso funcionar.

Aqui está o método FakeHttpConext () existente:

public static HttpContextBase FakeHttpContext()
{
    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    var response = new Mock<HttpResponseBase>();
    var session = new Mock<HttpSessionStateBase>();
    var server = new Mock<HttpServerUtilityBase>();

    // Our identity additions ...
    var user = new Mock<IPrincipal>();
    OurIdentity identity = (OurIdentity)Thread.CurrentPrincipal.Identity;

    context.Expect(ctx => ctx.Request).Returns(request.Object);
    context.Expect(ctx => ctx.Response).Returns(response.Object);
    context.Expect(ctx => ctx.Session).Returns(session.Object);
    context.Expect(ctx => ctx.Server).Returns(server.Object);
    context.Expect(ctx => ctx.User).Returns(user.Object);
    context.Expect(ctx => ctx.User.Identity).Returns(identity);
    return context.Object;
}

Aqui está o método de explosão (que faz parte do XMLResult do projeto MVC Contrib):

public override void ExecuteResult(ControllerContext context)
{
    if (_objectToSerialize != null)
    {
       var xs = new XmlSerializer(_objectToSerialize.GetType());
       context.HttpContext.Response.ContentType = "text/xml";
       xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
    }
}

O que preciso adicionar no método FakeHttpContext para evitar a exceção nula quando o contexto.httpContext.Response.Output é referenciado?

Esclarecimento: A solução que procuro precisa ser feita no MOQ, não no rinoceronte. Mencionei o MOQ no título da pergunta, mas negligenciei isso no corpo da pergunta. Desculpe por qualquer confusão.

ResoluçãoEu adicionei as duas linhas de código a seguir ao método FakeHttpContext ():

var writer = new StringWriter();
context.Expect(ctx => ctx.Response.Output).Returns(writer);

Isso impede a exceção nula. Não tenho certeza se é uma boa resposta a longo prazo, mas funciona por enquanto.

Foi útil?

Solução

Nos testes para MVCContrib O arquivo mvcmockhelps mostra como é feito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top