Moq Mocking и отслеживание значений сессии - PullRequest
5 голосов
/ 29 октября 2009

У меня проблемы с возвратом значения Session, установленного из mocking, используя Moq. Используя следующее

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

Когда я пытаюсь получить значение снаружи, используя

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

делать некоторые вещи, которые устанавливают Session ["id"]

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

sessionid оказывается -1. Но я могу получить установленное значение сеанса, используя

th.sessionValue

Что не так? Разве я не могу просто вернуть установленное значение через Moq?

Ответы [ 4 ]

11 голосов
/ 29 октября 2009

Мне нужно перестать отвечать на свои вопросы. Оказывается, мне снова нужно было смоделировать Session ["id"], как ...

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);
        });
2 голосов
/ 29 октября 2009
Методы

Moq Setup не работают с индексированными свойствами, имеющими строковые индексы. Смотрите здесь: Как сделать MOQ для индексированного свойства

1 голос
/ 10 июля 2014

Я потратил много времени, пытаясь найти самый простой способ сделать это с помощью moq, ниже приведена копия моего кода, которая действительно работала для меня:

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;

надеюсь, это поможет!

1 голос
/ 07 апреля 2011

Это потому, что вы возвращаете значение в получателе, которое было передано по значению. Поэтому каждый раз, когда вы вызываете метод получения, вы возвращаете одно и то же значение.

Измените Returns () на использование делегата, чтобы он оценивался каждый раз. Таким образом, вы получите правильное значение каждый раз:)

Намного проще, чем SetupGet, встроенный в 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);
...