【发布时间】:2015-03-16 14:09:08
【问题描述】:
我有一个工作应用程序,现在我需要为其添加一整套单元测试。当前代码存储用户信息如下:
HttpContext.Current.Session["UserInfo"] = userData;
我使用 moq 进行测试,我的单元测试有以下代码:
var server = new Mock<HttpServerUtilityBase>(MockBehavior.Loose);
var response = new Mock<HttpResponseBase>(MockBehavior.Strict);
var request = new Mock<HttpRequestBase>(MockBehavior.Strict);
var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);
context.SetupGet(x => x.Server).Returns(server.Object);
var controller = new LoginController();
controller.ControllerContext = new ControllerContext(
context.Object,
new RouteData(),
controller);
JsonResult result = controller.LoginUser(
new LoginHelper {
userName = "myusername",
password = "invalidpassword"
}
) as JsonResult;
当然,当我到达登录进程尝试创建会话数据的位置时,我得到一个“未设置对象实例的对象引用”。错误,因为 HttpContext.Current 为空。
一些研究表明,使用 Current 与 MSTest 并不完全兼容,因此我知道我可能需要更改存储/加载用户信息的方式。不过,我想就去这里的方式提出一些建议。
如果有任何关于如何让我的单元测试正常工作或存储用户信息以使其与单元测试更兼容的不同方法的建议,我将不胜感激。
【问题讨论】:
-
在 ASP.Net MVC 应用程序中使用
HttpContext.Current很奇怪,但是您可以简单地将HttpContext.Current设置为您的模拟上下文(创建这样的上下文完全是另一回事,所以 :))...您确实应该考虑使用 MVC 方式访问上下文或将整个会话包装到接口中并依赖于该接口,而不是直接访问HttpContext.Current。 -
@AlexeiLevenkov 如果使用 HttpContext.Current 很奇怪,还有什么替代方案?
-
另一种方法是将 SessionStateBase 注入控制器,而不是从 HttpContext 中获取。
标签: c# asp.net-mvc unit-testing moq mstest