Mock HttpContext使用moq进行unit testing

我需要模拟HttpContext进行unit testing。 但我正在努力。

我正在创建一个方法,通过SessionIdManager以编程方式更改sessionId。 而SessionIdManager需要HttpContext而不是HttpContextBase。

但我找不到任何模拟HttpContext的例子。 那里的所有例子都只是制作HttpContextBase。

我在下面试过但是没用

HttpContext httpContext = Mock(); HttpContext httpContext = (HttpContext)GetMockHttpContextBase(); public HttpContextBase GetMockHttpContextBase() { var context = new Mock(); var request = new Mock(); var response = new Mock(); var session = new Mock(); var application = new Mock(); var httpContext = new Mock(); var server = new Mock(); var user = new Mock(); var identity = new Mock(); var urlHelper = new Mock(); var routes = new RouteCollection(); var requestContext = new Mock(); requestContext.Setup(x => x.HttpContext).Returns(context.Object); context.Setup(ctx => ctx.Request).Returns(request.Object); context.Setup(ctx => ctx.Response).Returns(response.Object); context.Setup(ctx => ctx.Session).Returns(session.Object); application.Setup(x => x.Context).Returns(httpContext.Object); context.Setup(ctx => ctx.ApplicationInstance).Returns(application.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("test"); request.Setup(req => req.Url).Returns(new Uri("http://tempuri.org")); request.Setup(req => req.RequestContext).Returns(requestContext.Object); requestContext.Setup(x => x.RouteData).Returns(new RouteData()); request.SetupGet(req => req.Headers).Returns(new NameValueCollection()); return context.Object; } 

有没有办法模仿HttpContext或者为HttpContext使用HttpContextBase?

请帮助我任何人。

这是一个常见的问题,问题的根源是你不要自己的模式类型。 而不是复杂的模拟试图重现你没有编写的类的行为(这意味着你猜测它做什么以及你需要模拟什么),在你的代码和外部对象之间引入一个抽象HttpContext和mock那抽象。 作为模拟对象的先驱之一说:

对我而言,关键在于Joe Walnes提出了“不要嘲笑你不拥有的类型”的激进概念。 这意味着:停止跳过篮球与封闭世界的图书馆一起工作,使用测试来发现你的对象以及他们彼此说的话。

http://higherorderlogic.com/2004/02/the-big-idea-is-messaging/

如果你试图模拟HttpContext,那么你将不得不使用相当多的样板来实质上模拟它。

Phil Haack在这篇博文中详细描述了这种方法: http : //haacked.com/archive/2005/06/11/simulating_httpcontext.aspx/

正如我之前所说,我想要一种“轻量级”的方法来测试这种方法。 如果HttpContext.Current是HttpContext的有效实例,则不会有问题。 幸运的是,HttpContext的静态Current属性既可读又可写。 只需将该属性设置为正确创建的HttpContext实例即可。 但是,创建该实例并不像我的第一次尝试那么简单。 我会告诉你无聊的细节,只是告诉你我最终的结果。

他在这里提供了一个模拟器框架: http : //haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx/

请记住,您可能会尝试使用所有这些进行集成测试,因为模拟这些对象所涉及的逻辑非常重要,并且可能会干扰测试的可靠性。