2009-10-29 69 views
5

我有问题返回使用Moq嘲笑的会话值集。使用下面的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(); 

做一些东西,设置会话值[ “ID”]

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

的SessionID真可谓为-1。但我可以使用

th.sessionValue 

怎么了?我不能简单地通过Moq返回设定值吗?

回答

11

我需要停止回答我自己的问题。事实证明,我需要再次嘲笑会话[“身份证”]是这样的...

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

这对我没有用:@Konamimam似乎是正确的,.Callback不会被解雇。正确的方法似乎在这里:http://stackoverflow.com/a/2921695/213609 – 2013-05-10 15:17:56

2

Moq的Setup方法不适用于具有字符串索引的索引属性。看到这里:How to MOQ an Indexed property

+0

如果它不起作用,那么应该不会Session [“id”]返回null而不是-1? – sean 2009-10-29 12:33:26

+0

另外,您链接的问题的答案似乎表明它的工作原理? – 2009-10-29 16:01:14

1

这是因为你在回国这是按值传递,吸附剂中的价值。所以每次调用getter时,都会返回相同的值。

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

比在SetupSet中嵌入的SetupGet更容易在眼睛上。

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

我只花了很长时间试图找出与起订量做到这一点最简单的方法,下面是我的代码复制过去,实际上为我工作:

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; 

希望这有助于!