我的 Controller 操作之一(在 Ajax 请求中调用的操作)正在向客户端返回一个 URL,以便它可以执行重定向。我正在使用 Url.RouteUrl(..)
,在单元测试期间,由于 Controller.Url
参数未预先填充,因此失败。
我尝试了很多方法,其中包括尝试 stub UrlHelper
(失败了),手动创建一个带有RequestContext
的UrlHelper
有一个已 stub 的 HttpContextBase
(在 RouteCollection.GetUrlWithApplicationPath
调用上失败)。
我在谷歌上搜索过,但几乎没有找到任何关于这个主题的信息。我是否在 Controller 操作中使用 Url.RouteUrl
做了一些极其愚蠢的事情?有没有更简单的方法?
更糟糕的是,我希望能够在单元测试中测试返回的 URL - 事实上我只想知道它重定向到正确的路由,但因为我返回了一个 URL我想控制已解析的 URL,而不是路由(例如,通过使用 stub 的 RouteCollection
) - 但我很高兴让我的测试一开始就通过。
最佳答案
这是我针对类似情况的测试之一(xUnit + Moq)(在 Controller 中使用 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);
关于asp.net-mvc - ASP.NET MVC : Unit testing controllers that use UrlHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674458/