当前位置:  开发笔记 > 后端 > 正文

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

如何解决《ASP.NETMVC:使用UrlHelper的单元测试控制器》经验,为你挑选了3个好方法。

我的一个控制器操作,一个在Ajax请求中被调用,正在向客户端返回一个URL,以便它可以进行重定向.我正在使用Url.RouteUrl(..)并且在我的单元测试期间由于Controller.Url参数未预先填充而失败.

我尝试了很多东西,其中包括尝试存根UrlHelper(失败),手动创建一个UrlHelper带有RequestContext存根HttpContextBase(在RouteCollection.GetUrlWithApplicationPath调用时失败)的存根.

我搜索了谷歌,但几乎没有发现这个问题.我Url.RouteUrl在Controller操作中使用了一些非常愚蠢的东西吗?有没有更简单的方法?

更糟糕的是,我希望能够在我的单元测试中测试返回的URL - 实际上我只是想知道它重定向到正确的路由,但是因为我正在返回一个URL而不是一个URL route,我想控制解析的URL(例如,通过使用stubbed RouteCollection) - 但我很乐意让我的测试通过开始.



1> eu-ge-ne..:

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

希望这可以帮助:

var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

var request = new Mock(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(MockBehavior.Strict);
response.Setup(x => x.ApplyAppPathModifier("/post1")).Returns("http://localhost/post1");

var context = new Mock(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);


+1优秀.虽然提示:我将其用作MockHelper并将Apply.SPathup更改为ApplyAppPathModifier:response.Setup(x => x.ApplyAppPathModifier(Moq.It.IsAny ())).返回((String url) )=> url); 这很难看,但是我将序列化对象以url编码形式返回,而不是硬编码返回的值.
`ApplyAppPathModifier`部分是UrlHelper的关键位
暂时我使用了一个解决方案,我将对UrlHelper的调用抽象出来,以便我可以拦截它们.感谢您的代码片段,它将节省我很多时间来确定如何正确模拟Request/Response/ControllerContext.

2> Steven Pena..:

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

var context = new Mock();
var request = new Mock();
var response = new Mock();
var session = new Mock();
var server = new Mock();

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())).Returns(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);



3> Gerardo Cont..:

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有