Test if a request's URL is in the Route table

前端 未结 4 563
再見小時候
再見小時候 2020-12-16 21:48

I want to test if a URL is part of the routes defined in the Global.asax. This is what I have:

var TheRequest = HttpContext.Current.Request.Url.         


        
4条回答
  •  误落风尘
    2020-12-16 22:23

    You could try checking the current context against route table

    var contextBase = HttpContext.Current.Request.RequestContext.HttpContext;
    var data = RouteTable.Routes.GetRouteData(contextBase);
    if (data != null) {
        //Route exists
    }
    

    Using the above as a basis of creating a service

    public interface IRouteInspector {
        bool RequestIsInRoutes();
    }
    
    public interface IHttpContextAccessor {
        HttpContextBase HttpContext { get; }
    }
    
    public interface IRouteTable {
        RouteCollection Routes { get; }
    }
    
    public class RouteInspector : IRouteInspector {
        private IRouteTable routeTable;
        private IHttpContextAccessor contextBase;
    
        public RouteInspector(IRouteTable routeTable, IHttpContextAccessor contextBase) {
            this.routeTable = routeTable;
            this.contextBase = contextBase;
        }
    
        public bool RequestIsInRoutes() {
            if (routeTable.Routes.GetRouteData(contextBase.HttpContext) != null) {
                //Route exists
                return true;
            }
            return false;
        }
    }
    

    And here is test class showing how it is used.

    [TestClass]
    public class RouteTableUnitTests : ControllerUnitTests {
        [TestMethod]
        public void Should_Get_Request_From_Route_Table() {
            //Arrange                
            var contextBase = new Mock();
            contextBase.Setup(m => m.HttpContext)
                .Returns(HttpContext.Current.Request.RequestContext.HttpContext);
            var routeTable = new Mock();
            routeTable.Setup(m => m.Routes).Returns(RouteTable.Routes);
            var sut = new RouteInspector(routeTable.Object, contextBase.Object);
            //Act
            var actual = sut.RequestIsInRoutes();
            //Assert
            Assert.IsTrue(actual);
        }
    }
    

    There is room for refactoring and improvements but it's a start.

提交回复
热议问题