我看过一些关于测试微软路由的非常有用的帖子。其中一个特别是www.strathweb.com/2012/08/testing-routes-in-asp-net-web-api/似乎只处理WebApi。虽然相似但它们并不相同。如果我有一个MVC应用程序,我如何看到将为给定的URL调用的方法。它似乎可以归结为创建一个'Request',它可以传递给HttpControllerContext的构造函数,并在测试中获得对'current'配置(如HttpConfiguration)的引用。想法?
谢谢。
答案 0 :(得分:1)
测试传入网址
如果你需要测试路由,你需要模拟MVC框架中的三个类:HttpRequestBase,HttpContextBase和HttpResponseBase(仅用于传出URL)
private HttpContextBase CreateHttpContext(string targetUrl = null, string httpMethod = "GET")
{
// create mock request
Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
// url you want to test through the property
mockRequest.Setup(m => m.AppRelativeCurrentExecutionFilePath).Returns(targetUrl);
mockRequest.Setup(m => m.HttpMethod).Returns(httpMethod);
// create mock response
Mock<HttpResponseBase> mockResponse = new Mock<HttpResponseBase>();
mockResponse.Setup(m => m.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(s => s);
// create the mock context, using the request and response
Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
mockContext.Setup(m => m.Request).Returns(mockRequest.Object);
mockContext.Setup(m => m.Response).Returns(mockResponse.Object);
// return the mock context object
return mockContext.Object;
}
然后您需要一个额外的辅助方法,让您指定要测试的URL和预期的段变量以及其他变量的对象。
private void TestRouteMatch(string url, string controller, string action,
object routeProperties = null, string httpMethod = "GET")
{
// arrange
RouteCollection routes = new RouteCollection();
// loading the defined routes about the Route-Config
RouteConfig.RegisterRoutes(routes);
RouteData result = routes.GetRouteData(CreateHttpContext(url, httpMethod));
// assert
Assert.IsNotNull(result);
// here you can check your properties (controller, action, routeProperties) with the result
Assert.IsTrue(.....);
}
您不需要在测试方法中定义路线,因为它们是使用 RouteConfig 类中的 RegisterRoutes 方法直接加载的。
入站网址匹配的机制有效。
GetRouteData(HttpContextBase httpContext)
框架为每个路由表条目调用此方法,直到其中一个返回非空值。
您必须以这种方式调用辅助方法作为示例
[TestMethod]
public void TestIncomingRoutes() {
// check for the URL that is hoped for
TestRouteMatch("~/Home/Index", "Home", "Index");
}
该方法检查您期望的URL,如上例所示,在Home控制器中调用Index操作。您必须在URL前面加上波形符(〜),这就是ASP.NET框架如何将URL提供给路由系统的方式。
参考Adam Freeman的书 Pro ASP.NET MVC 5 ,我可以向每个ASP.NET MVC开发人员推荐它!