gen*_*i98 11 c# unit-testing moq mocking asp.net-mvc-3
我需要模拟HttpContext进行单元测试.但我正在努力解决它.
我正在创建一个方法,通过SessionIdManager以编程方式更改sessionId.而SessionIdManager需要HttpContext而不是HttpContextBase.
但我找不到任何模拟HttpContext的例子.所有的例子都只是制作HttpContextBase.
我在下面试过,但他们没有用
HttpContext httpContext = Mock<HttpContext>();
HttpContext httpContext = (HttpContext)GetMockHttpContextBase();
public HttpContextBase GetMockHttpContextBase()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var application = new Mock<HttpApplication>();
var httpContext = new Mock<HttpContext>();
var server = new Mock<HttpServerUtilityBase>();
var user = new Mock<IPrincipal>();
var identity = new Mock<IIdentity>();
var urlHelper = new Mock<UrlHelper>();
var routes = new RouteCollection();
var requestContext = new Mock<RequestContext>();
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;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法模拟HttpContext或者为HttpContext使用HttpContextBase?
请帮助我.
Mik*_*ale 13
这是一个常见的问题,问题的根源是你不要自己的模式类型.而不是复杂的模拟试图重现你没有编写的类的行为(这意味着你猜测它做什么以及你需要模拟什么),在你的代码和外部对象之间引入一个抽象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/
请记住,您可能会冒险进行所有这些的集成测试,因为模拟这些对象所涉及的逻辑非常重要,并且会干扰测试的可靠性。
| 归档时间: |
|
| 查看次数: |
14160 次 |
| 最近记录: |