我认为使用Moq来模拟一个HttpContext只是你可能想要尝试的方式。
[TestMethod]
public void Test()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
context.Setup(c => c.Request).Returns(request.Object);
HomeController controller = new HomeController();
controller.ControllerContext = new ControllerContext(context , new RouteData(), controller);
....
...........
}
更新时间:
如果您想嘲笑HttpSession中(如在评论中提及gdoron)的情况。它并不是很复杂,因为你是Mocking,并不意味着你必须构建完整的,真实的对象及其所有属性。
假设您的控制器将
- 检查是否用户进行身份验证。
- 获取标识名称。
- 从Session [“key”]中获取一个值。
- 操纵cookie。
的代码可能是这样的:
[TestMethod]
public void Test()
{
......
.........
var mockedControllerContext = new Mock<ControllerContext>();
mockedControllerContext.SetupGet(p => p.HttpContext.Session["key"]).Returns("A value in session");
mockedControllerContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
mockedControllerContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("An identity name");
mockedControllerContext.SetupGet(p => p.HttpContext.Response.Cookies).Returns(new HttpCookieCollection());
HomeController controller = new HomeController();
controller.ControllerContext = mockedControllerContext.Object;
.....
......
}
有一个快速浏览一下他们,特别是我的情况,看来你是能够建立一个控制范围内,但不会出现是初始化ASP的HTTPContext.Current的任何东西。因此,当我的动作调用静态包装类时,它依次尝试访问HTTPContext.Current.Session,我得到一个错误。我想我只需要经历在我的测试中初始化HTTPContext.Current的痛苦? – ricardo
@ricardo它看起来像你不使用DI。注入httpContext并且所有的问题都会消失......使用静态httpContext.Current是一个错误,你可以在你的情况下看到它。祝你好运! – gdoron