测试MVC Controller方法的URL

时间:2016-09-20 17:54:27

标签: asp.net-mvc testing routing

我看过一些关于测试微软路由的非常有用的帖子。其中一个特别是www.strathweb.com/2012/08/testing-routes-in-asp-net-web-api/似乎只处理WebApi。虽然相似但它们并不相同。如果我有一个MVC应用程序,我如何看到将为给定的URL调用的方法。它似乎可以归结为创建一个'Request',它可以传递给HttpControllerContext的构造函数,并在测试中获得对'current'配置(如HttpConfiguration)的引用。想法?

谢谢。

1 个答案:

答案 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)

referencesource.microsoft

框架为每个路由表条目调用此方法,直到其中一个返回非空值。

您必须以这种方式调用辅助方法作为示例

    [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开发人员推荐它!