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

 2023-02-17    331  

问题描述

我的控制器操作之一,在Ajax请求中调用的操作,正在将URL返回给客户端,以便重定向.我正在使用Url.RouteUrl(..),在我的设备期间测试,由于Controller.Url参数未预先填充,因此此失败.

我尝试了很多东西,其中包括将UrlHelper(失败)分开,手动创建一个RequestContext的RequestContext,其中一个stubbed HttpContextBase(在RouteCollection.GetUrlWithApplicationPath呼叫上失败).

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

我搜索了谷歌,但几乎没有关于这个主题的任何东西.我在我的控制器操作中使用Url.RouteUrl做些什么令人难以置信的愚蠢吗?是否有更容易的方法?

让它变得更糟,我希望能够在我的单位测试中测试返回的网址 – 事实上,我只对知道它重定向到正确的路线很感兴趣,而且因为我返回一个URL我想控制解析的URL(例如,通过使用Stubbed RouteCollection) – 但我很乐意让我的考试通过.

推荐答案

这是我的测试(xunit + moq)只是类似的情况(使用控制器中的url.routeurl)

希望这有助于:

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

其他推荐答案

从eu-ge-ne的修改实施.此一个基于应用程序中定义的路由返回生成的链接. EU-GE-NE示例始终返回固定响应.下面的方法将允许您测试正确的操作/控制器和路由信息被传递到URLhelper – 如果您正在测试对URLHELPER测试调用.

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

其他推荐答案

如果要模拟httpcontextbase类,则此帖子可能很有用.

以上所述是小编给大家介绍的ASP.NET MVC: 使用UrlHelper的单元测试控制器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:http://www.77isp.com/post/34273.html

=========================================

http://www.77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。