【问题标题】:How to mock httpcontext so that it is not null from a unit test?如何模拟 httpcontext 使其在单元测试中不为空?
【发布时间】:2012-06-29 23:56:49
【问题描述】:

我正在编写一个单元测试,控制器方法抛出异常,因为 HttpContext / ControllerContext 为空。我不需要从 HttpContext 断言任何东西,只需要它不为 NULL。我做过研究,我相信最小起订量就是答案。但是我所看到的所有样本都对我没有多大帮助。我不需要做任何花哨的事情,只是为了模拟 httpcontext。为我指明正确的方向!

【问题讨论】:

  • 我认为这篇文章会对你有所帮助。 stackoverflow.com/questions/542132/…
  • 知道了!这篇文章很有帮助:emadibrahim.com/2008/04/04/… 使用两种方法制作了一个 HttpContextFactory 类。一个模拟 httpcontext,另一个将当前控制器上下文设置为模拟数据。
  • 您应该在此处放置一些概述您的解决方案的示例代码,作为您问题的答案。确保尽可能接受它。

标签: asp.net-mvc-3 unit-testing mocking moq httpcontext


【解决方案1】:

我知道这是一个较老的主题,但是模拟 MVC 应用程序进行单元测试是我们经常做的事情。

在升级到 Visual Studio 2013 后,我只是想补充一下使用 Moq 4 模拟 MVC 3 应用程序的经验。没有一个单元测试在调试模式下工作,并且 HttpContext 在尝试窥视时显示“无法评估表达式”在变量处。

原来 Visual Studio 2013 在评估某些对象时存在问题。为了让调试模拟的 Web 应用程序再次运行,我必须检查 Tools=>Options=>Debugging=>General settings 中的“Use Managed Compatibility Mode”。

【讨论】:

    【解决方案2】:

    在一个类中从here得到这两个函数;

    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;
            }
    
    
        }
    

    在单元测试中我这样称呼它们;

     HttpContextFactory.SetFakeAuthenticatedControllerContext(controller);
    

    确保您的测试项目中安装了Moq

    Install-Package Moq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2013-06-13
      • 2011-04-09
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多