我正在尝试使用 Moq 模拟 Controller 的 session 变量。我一直遇到的问题是, session 在测试中是可见的,但在实际 Controller 中为空。
测试代码:
[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
}
Controller 代码:
public User CurrentUser
{
get
{
return (User)Session["user"]; //HttpContext is null at this point
}
}
上面的代码遵循我见过的最常见的模式(几个 SO 帖子、Action Ch. 7 示例中的 MVC 2 等),但仍然不起作用。在 Controller 内部,ControllerContext 为 null,HttpContext 也为 null。我做错了什么?
最佳答案
这一定是由于将单元测试项目添加到已经存在的项目而引起的配置问题,因为我刚刚创建了一个新的 MVC 3 项目,选中了“创建单元测试项目”,添加了我的所有 Controller 、模型等等从旧项目到新项目,并且运行得很好。
关于asp.net-mvc - 在 MVC 3 中模拟 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5174400/