Moq模拟和跟踪会话值

我在使用Moq从mocking返回Session值集时遇到问题。 使用以下内容

public class TestHelpers { public long sessionValue = -1; public HttpContextBase FakeHttpContext() { var httpContext = new Mock(); var session = new Mock(); httpContext.Setup(x => x.Session).Returns(session.Object); httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); httpContext.SetupSet(x => x.Session["id"] = It.IsAny()) .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返回设定值吗?

我需要停止回答我自己的问题。 事实certificate,我需要再次模拟Session [“id”] ……

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

Moq的Setup方法不适用于具有字符串索引的索引属性。 请参见: 如何MOQ索引属性

这是因为你返回的值是通过值传递的getter中的值。 因此,每次调用getter时,都会返回相同的值。

更改Returns()以使用委托,以便每次都对其进行评估。 这样你每次都会得到正确的值:)

眼睛比嵌入在SetupSet中的SetupGet容易得多。

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

我花了很长时间试图找出用moq做最简单的方法,下面是我的代码实际上对我有用的副本:

 var _adminctrl = new Moq.Mock(); //AdminController is my MVC controller var mock = new Mock(); 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; 

希望这可以帮助!