问题描述
我的控制器操作之一,在 Ajax 请求中被调用,正在向客户端返回一个 URL,以便它可以进行重定向.我正在使用 Url.RouteUrl(..)
并且在我的单元测试期间这失败了,因为 Controller.Url
参数没有预填充.
One of my controllers actions, one that is being called in an Ajax request, is returning an URL to the client side so it can do a redirection. I'm using Url.RouteUrl(..)
and during my unit tests this fails since the Controller.Url
parameter is not pre-filled.
我尝试了很多方法,其中包括尝试存根 UrlHelper
(失败),手动创建带有 RequestContext
的 UrlHelper
有一个存根 HttpContextBase
(在 RouteCollection.GetUrlWithApplicationPath
调用中失败).
I tried a lot of things, among others attempting to stub UrlHelper
(which failed), manually creating a UrlHelper
with a RequestContext
that has a stubbed HttpContextBase
(which failed on a RouteCollection.GetUrlWithApplicationPath
call).
我已经在 Google 上搜索过,但几乎没有找到关于该主题的任何内容.我是否在控制器操作中使用 Url.RouteUrl
做了一些非常愚蠢的事情?有没有更简单的方法?
I have searched Google but found virtually nothing on the subject. Am I doing something incredibly stupid using Url.RouteUrl
in my Controller action? Is there an easier way?
更糟糕的是,我希望能够在我的单元测试中测试返回的 URL - 事实上我只对知道它重定向到正确的路由感兴趣,但是因为我返回的是一个 URL而不是路由,我想控制解析的 URL(例如,通过使用存根 RouteCollection
) - 但我很高兴让我的测试通过.
To make it even worse, I'd like to be able to test the returned URL in my unit test - in fact I'm only interested in knowing it's redirecting to the right route, but since I'm returning an URL instead of a route, I would like to control the URL that is resolved (eg. by using a stubbed RouteCollection
) - but I'll be happy to get my test passing to begin with.
推荐答案
这是我的一个测试(xUnit + Moq),仅用于类似情况(在控制器中使用 Url.RouteUrl)
Here is one of my tests (xUnit + Moq) just for similar case (using Url.RouteUrl in controller)
希望这有帮助:
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:使用 UrlHelper 的单元测试控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!