Moq Mocking e valores de sessão de rastreamento
-
10-07-2019 - |
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?
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!