5 votes

Moq Mocking et suivi des valeurs de session

J'ai des problèmes pour renvoyer un ensemble de valeurs de session à partir d'une simulation utilisant Moq. En utilisant ce qui suit

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;
        });
  }
}

Lorsque j'essaie d'obtenir la valeur à l'extérieur en utilisant

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

faire quelque chose qui définit Session["id"]

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

sessionid s'avère être -1, mais je peux obtenir la valeur de session définie en utilisant

th.sessionValue

Qu'est-ce qui ne va pas ? Ne puis-je pas simplement renvoyer la valeur définie via Moq ?

11voto

seanlinmt Points 3032

Je dois arrêter de répondre à mes propres questions. Il s'est avéré que j'avais besoin de simuler Session["id"] à nouveau comme ceci ...

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);
        });

2voto

Konamiman Points 20578

Moq's Setup ne fonctionnent pas avec les propriétés indexées qui ont des index de chaîne. Voir ici : Comment établir le MOQ d'un bien indexé

1voto

stoj Points 183

C'est parce que vous retournez la valeur dans le getter qui a été passée par valeur. Ainsi, chaque fois que vous invoquez le getter, vous obtenez la même valeur en retour.

Changez le Returns() pour utiliser un délégué afin qu'il soit évalué à chaque fois. De cette façon, vous obtiendrez la valeur correcte à chaque fois :)

Beaucoup plus facile à regarder qu'un SetupGet intégré dans un 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);

1voto

wizpert Points 850

Je viens de passer beaucoup de temps à essayer de trouver la façon la plus simple de le faire avec moq, ci-dessous est une copie de mon code qui a réellement fonctionné pour moi :

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;

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X