Asp.net mvc 在MVC 3中模拟会话

Asp.net mvc 在MVC 3中模拟会话,asp.net-mvc,unit-testing,mocking,moq,Asp.net Mvc,Unit Testing,Mocking,Moq,我试图使用Moq模拟控制器的会话变量。我经常遇到的是,会话在测试中是可见的,但在实际控制器中是空的 测试代码: [TestMethod] public void SessionTest() { var controller = new BaseController(); var controllerContext = new Mock<ControllerContext>(); controllerContext.Setup(cc => cc.HttpC

我试图使用Moq模拟控制器的会话变量。我经常遇到的是,会话在测试中是可见的,但在实际控制器中是空的

测试代码:

[TestMethod]
public void SessionTest()
{
    var controller = new BaseController();
    var controllerContext = new Mock<ControllerContext>();
    controllerContext.Setup(cc => cc.HttpContext.Session["user"]).Returns(new User());
    controller.ControllerContext = controllerContext.Object;

    User currentUser = controller.CurrentUser; //fails (throws NullReferenceException)
    User currentUser = (User)controller.Session["test"]; //works
}

上面的代码遵循了我见过的最常见的模式(一些SO帖子,MVC2在行动中的第7章示例,等等),但仍然不起作用。在控制器内部,ControllerContext与HttpContext一样为null。我做错了什么?

这一定是由于将单元测试项目添加到现有项目中引起的配置问题,因为我刚刚创建了一个新的MVC 3项目,选中了“创建单元测试项目”,将我所有的控制器、模型等从旧项目添加到了新项目中,而且它工作得很好。

我刚刚创建了一个简单的解决方案,重复您的问题,我无法重现它。您使用的最小起订量是什么版本?
public User CurrentUser
{
    get
    {
        return (User)Session["user"]; //HttpContext is null at this point
    }
}