Question

Je ne parviens pas à renvoyer un ensemble de valeurs de session en se moquant de Moq. Utilisation de 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 en dehors de

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

faire des choses qui définissent la 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? Puis-je simplement renvoyer la valeur définie via Moq?

Était-ce utile?

La solution

Je dois arrêter de répondre à mes propres questions. Il s’avère que j’avais besoin de me moquer de la session [& id; "] à nouveau comme si ...

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

Autres conseils

Les méthodes

Les méthodes Setup de Moq ne fonctionnent pas avec les propriétés indexées comportant des index de chaîne. Voir ici: Comment définir une propriété indexée

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

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

Beaucoup plus facile sur les yeux 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);

Je viens de passer beaucoup de temps à essayer de trouver le moyen le plus simple de le faire avec moq. Vous trouverez ci-dessous 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;

espérons que cela aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top