Pergunta

Estou tendo problemas retornando um conjunto valor Sessão de zombando usando Moq. Usando o seguinte

public class TestHelpers
{
 public long sessionValue = -1;
 public HttpContextBase FakeHttpContext()
 {

  var httpContext = new Mock<HttpContextBase>();
  var session = new Mock<HttpSessionStateBase>();
  httpContext.Setup(x => x.Session).Returns(session.Object);
  httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue);
  httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>())
        .Callback((string name, object val) =>
        {
           sessionValue = (long)val;
        });
  }
}

Quando tento obter o valor fora usando

var th = new TestHelpers();
HttpContextBase httpContext = th.FakeHttpContext();

fazer algumas coisas que conjuntos Session [ "id"]

var sessionid = httpContext.Session["id"];

voltas sessionid a ser -1. Mas eu posso obter o valor da sessão set usando

th.sessionValue

errada de que? não pode simplesmente devolver o valor ajustado através Moq?

Foi útil?

Solução

Eu preciso parar responder às minhas próprias perguntas. Acontece que eu precisava para zombar Session [ "id"] novamente assim ...

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>())
        .Callback((string name, object val) =>
        {
           sessionValue = (long)val;
           httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue);
        });

Outras dicas

métodos Setup de Moq não funcionam com propriedades indexadas que têm índices de cordas. Veja aqui: Como MOQ uma propriedade indexada

É porque você está retornando o valor no getter que foi passada por valor. Então toda vez que você chamar o getter, você obtém o mesmo valor retornado.

Alterar as Returns () para usar um delegado por isso é avaliada a cada vez. Dessa forma, você irá obter o valor correto de cada vez:)

Muito mais fácil no olho do que um SetupGet incorporado dentro de um SetupSet.

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>())
        .Callback((string name, object val) => sessionValue = (long)val);
httpContext.SetupGet(x => x.Session["id"]).Returns(() => sessionValue);

Eu só passei muito tempo tentando descobrir a maneira mais fácil de fazê-lo com moq, abaixo é um passado exemplar do meu código que realmente funcionou para mim:

var _adminctrl = new Moq.Mock<AdminController>(); //AdminController is my MVC controller

var mock = new Mock<ControllerContext>();
mock.Object.Controller = _adminctrl.Object;
mock.Setup(p => p.HttpContext.Session["UserInfoKey"]).Returns(new ViewModel());
 //here is the catch, attaching the ControllerContext to your controller
_adminctrl.Object.ControllerContext = mock.Object;

espero que isso ajude!

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