【问题标题】:How to use microsoft fakes to Mock HttpSessionStateBase如何使用微软假货来模拟 HttpSessionStateBase
【发布时间】:2012-09-21 01:21:02
【问题描述】:

起订码:

mockControllerContext.SetupGet(x => x.HttpContext.Session["User"]).Returns(new User
{
    Name = "Moto", 
    IsAdmin = true                                                                                        
});
taskController.ControllerContext = mockControllerContext.Object;

如何使用 MS Fakes 来模拟 HttpContext.Session???

【问题讨论】:

    标签: asp.net asp.net-mvc mocking moq httpcontext


    【解决方案1】:

    在一个类中从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);
    

    【讨论】:

    • 我想使用 MicroSoft Fakes FrameWork(VS2012) 来模拟 HttpSessionStateBasem,而不是使用起订量。
    【解决方案2】:

    您可以将shims 用于 Microsoft Fakes。但是,我发现这是一种不好的做法。相反,您应该通过将第三方库包装在您自己的类中来将它们与第三方库隔离。然后,您可以在该类上放置一个接口,并在整个代码中使用您的接口。这个anti-corruption layer 允许您保护自己免受第三方程序集的影响,并且当第三方程序集发生变化时您受到的影响较小。

    如果您想了解有关使用 shim 的更多信息,可以查看我在 Microsoft Fakes 上撰写的 this Pluralsight course。 (全面披露:我在这门课程中获得版税,但这是一种快速上手的方法)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2020-01-07
      相关资源
      最近更新 更多