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

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

我尝试了很多东西,其中包括试图UrlHelper (失败),手动创建UrlHelperRequestContext ,后者具有存根HttpContextBase (在RouteCollection.GetUrlWithApplicationPath调用失败)。

我搜索了Google,但在这个主题上几乎找不到任何东西。 我在我的Controller动作中使用Url.RouteUrl做了一件令人难以置信的蠢事? 有更容易的方法吗?

更糟糕的是,我希望能够在我的单元测试中测试返回的URL - 事实上,我只对知道它重定向到正确的路线感兴趣,但由于我返回的是URL而不是路线,我想控制已解决的URL(例如,通过使用存根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的修改实现。 这个基于应用程序中定义的路线返回一个生成的链接。 欧格尼的例子总是返回一个固定的答案。 下面的方法将允许您测试正确的操作/控制器和路由信息是否正在传递到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类,这篇文章可能会很有用。

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

链接地址: http://www.djcxy.com/p/48115.html

上一篇: ASP.NET MVC: Unit testing controllers that use UrlHelper

下一篇: HOW? Controller return nothing/current view