Asp.net mvc 3 如何模拟httpcontext,使其在单元测试中不为null?
我正在编写一个单元测试,控制器方法正在抛出一个异常,因为HttpContext/ControllerContext为null。我不需要从HttpContext断言任何内容,只需要它不为NULL。我已经做了研究,我相信最小起订量就是答案。但我看到的所有样本对我帮助不大。我不需要做任何花哨的事情,只是为了模仿httpcontext。给我指出正确的方向 从一个类中获得这两个函数Asp.net mvc 3 如何模拟httpcontext,使其在单元测试中不为null?,asp.net-mvc-3,unit-testing,mocking,moq,httpcontext,Asp.net Mvc 3,Unit Testing,Mocking,Moq,Httpcontext,我正在编写一个单元测试,控制器方法正在抛出一个异常,因为HttpContext/ControllerContext为null。我不需要从HttpContext断言任何内容,只需要它不为NULL。我已经做了研究,我相信最小起订量就是答案。但我看到的所有样本对我帮助不大。我不需要做任何花哨的事情,只是为了模仿httpcontext。给我指出正确的方向 从一个类中获得这两个函数 public static class HttpContextFactory { public st
public static class HttpContextFactory
{
public static void SetFakeAuthenticatedControllerContext(this Controller controller)
{
var httpContext = FakeAuthenticatedHttpContext();
ControllerContext context =
new ControllerContext(
new RequestContext(httpContext,
new RouteData()), controller);
controller.ControllerContext = context;
}
private static HttpContextBase FakeAuthenticatedHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var user = new Mock<IPrincipal>();
var identity = new Mock<IIdentity>();
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
context.Setup(ctx => ctx.User).Returns(user.Object);
user.Setup(ctx => ctx.Identity).Returns(identity.Object);
identity.Setup(id => id.IsAuthenticated).Returns(true);
identity.Setup(id => id.Name).Returns("a.ali174");
return context.Object;
}
}
确保已在测试项目中安装:
Install-Package Moq
我知道这是一个比较老的主题,但是我们经常会模仿MVC应用程序进行单元测试 我只是想在升级到VisualStudio2013后,添加我使用MOQ4模拟MVC3应用程序的经验。没有一个单元测试在调试模式下工作,HttpContext在尝试查看变量时显示“无法计算表达式”
visual studio 2013在评估某些对象时出现问题。为了让调试模拟的web应用程序重新工作,我必须检查Tools=>Options=>debugging=>General settings中的“使用托管兼容性模式”。我认为这篇文章会帮到你。知道了!这篇文章帮助很大:用两个方法创建了一个HttpContextFactory类。一个是模拟httpcontext,另一个是将当前控制器上下文设置为模拟数据。您应该在这里放置一些示例代码,概述您的解决方案,作为问题的答案。如果可以的话,一定要接受。
Install-Package Moq