首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC:使用UrlHelper的单元测试控制器

ASP.NET MVC:使用UrlHelper的单元测试控制器
EN

Stack Overflow用户
提问于 2009-03-23 17:43:29
回答 5查看 37K关注 0票数 170

我的一个控制器操作,也就是在Ajax请求中调用的操作,向客户端返回一个URL,以便它可以执行重定向。我使用的是Url.RouteUrl(..),在我的单元测试期间,由于Controller.Url参数没有预先填充,所以失败了。

我尝试了很多方法,其中包括尝试存根UrlHelper (失败),手动创建一个带有存根RequestContextUrlHelper,该RequestContext有一个存根HttpContextBase ( RouteCollection.GetUrlWithApplicationPath调用失败)。

我在谷歌上搜索了一下,但在这个问题上几乎什么也没找到。在我的控制器操作中使用Url.RouteUrl是不是在做一些非常愚蠢的事情?有没有更简单的方法?

更糟糕的是,我希望能够在我的单元测试中测试返回的URL -事实上,我只对它是否重定向到正确的路由感兴趣,但由于我返回的是URL而不是路由,所以我希望控制解析的URL (例如。通过使用存根RouteCollection) -但我很高兴我的测试一开始就通过了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-23 21:18:04

这是我针对类似情况(在控制器中使用Url.RouteUrl )的一个测试(xUnit + Moq)。

希望这能有所帮助:

代码语言:javascript
复制
var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

var request = new Mock<HttpRequestBase>(MockBehavior.Strict);
request.SetupGet(x => x.ApplicationPath).Returns("/");
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection());

var response = new Mock<HttpResponseBase>(MockBehavior.Strict);
response.Setup(x => x.ApplyAppPathModifier("/post1")).Returns("http://localhost/post1");

var context = new Mock<HttpContextBase>(MockBehavior.Strict);
context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);

var controller = new LinkbackController(dbF.Object);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes);
票数 202
EN

Stack Overflow用户

发布于 2011-12-07 07:52:55

来自eu-ge-ne的修改后的实现。这个函数根据应用程序中定义的路由返回一个生成的链接。eu-ge-ne的示例总是返回固定的响应。下面的方法将允许您测试正确的操作/控制器和路由信息是否正在传递到UrlHelper中-如果您正在测试对UrlHelper的调用,这正是您想要的。

代码语言:javascript
复制
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>();

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

request.SetupGet(x => x.ApplicationPath).Returns("/");
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
request.SetupGet(x => x.ServerVariables).Returns(new NameValueCollection());

response.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x);

context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);

var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);
var helper = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes);
票数 37
EN

Stack Overflow用户

发布于 2009-04-28 20:35:29

如果你想模拟HttpContextBase类,这篇文章可能会很有用。

http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/674458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档