using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Reflection;
using System.Web;
using System.Web.Routing;
namespace WebApplication1.Tests
{
[TestClass]
public class RouteTests
{
private HttpContextBase CreateHttpContext(String targetUrl = null, string httpMethod = "GET")
{
// Mock request 객체를 생성한다.
Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
mockRequest.Setup(m => m.AppRelativeCurrentExecutionFilePath).Returns(targetUrl);
mockRequest.Setup(m => m.HttpMethod).Returns(httpMethod);
// Mock response를 생성한다.
Mock<HttpResponseBase> mockResponse = new Mock<HttpResponseBase>();
mockResponse.Setup(m => m.ApplyAppPathModifier(It.IsAny<String>())).Returns<string>(s => s);
// request 개체와 reponse 개체를 사용하는 mock 컨텍스트 개체를 생성한다.
Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
mockContext.Setup(m => m.Request).Returns(mockRequest.Object);
mockContext.Setup(m => m.Response).Returns(mockResponse.Object);
return mockContext.Object;
}
private void TestRouteMatch(string url, string controller, string action, object routeProperties = null, string httpMethod = "GET")
{
//Arrange
RouteCollection routes = new RouteCollection();
RouteConfig.RegisterRoutes(routes);
// Act - 라우트를 처리한다.
RouteData result = routes.GetRouteData(CreateHttpContext(url, httpMethod));
// Assert
Assert.IsNotNull(result);
Assert.IsTrue(TestIncomingRouteResult(result, controller, action, routeProperties));
}
private bool TestIncomingRouteResult(RouteData routeResult, string controller, string action, object propertySet = null)
{
Func<object, object, bool> valCompare = (v1, v2) =>
{
return StringComparer.InvariantCultureIgnoreCase.Compare(v1, v2) == 0;
};
bool result = valCompare(routeResult.Values["controller"], controller) && valCompare(routeResult.Values["action"], action);
if(propertySet != null)
{
PropertyInfo[] propInfo = propertySet.GetType().GetProperties();
foreach(PropertyInfo pi in propInfo)
{
if(!(routeResult.Values.ContainsKey(pi.Name)
&& valCompare(routeResult.Values[pi.Name],
pi.GetValue(propertySet, null))))
{
result = false;
break;
}
}
}
return result;
}
private void TestRouteFail(string url)
{
// Arrange
RouteCollection routes = new RouteCollection();
RouteConfig.RegisterRoutes(routes);
// Act
RouteData result = routes.GetRouteData(CreateHttpContext(url));
// Assert
Assert.IsTrue(result == null || result.Route == null);
}
[TestMethod]
public void TestIncomingRoutes()
{
// 성공 라우트
TestRouteMatch("~/Admin/Index", "Admin", "Index");
TestRouteMatch("~/One/Two", "One", "Two");
TestRouteMatch("~/Admin", "Admin", "Index");
TestRouteMatch("~/Admin/Index/Segment", "Admin", "Index");
TestRouteMatch("~/Admin/Index/1/userid/5", "Admin", "Index", new { search = "userid/5"});
// 실패 라우트
//TestRouteFail("~/");
}
}
}
-----------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace WebApplication1
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
//routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("myRoute", "{controller}/{action}",
new { action = "Index" }
);
routes.MapRoute(null, "{controller}/{action}/{id}/{*search}",
new { controller = "Admin", action = "Index", id = UrlParameter.Optional });
}
}
}