2014-01-29 2 views
0

Кто-нибудь издевался над FriendlyUrls для модульного тестирования?Mocking Asp.net FriendlyUrls

Я пишу тест, который должен издеваться над asp.net FriendlyUrls. Вызов, который мне нужно высмеять, это Request.GetFriendlyUrlSegments(). Я использую MS Fakes.

Вот мой тест до сих пор:

// Arrange 
      var httpContext = TestHelper.StubHtppContext("", "http://localhost/content.aspx/area/controller/action/OtherRouteValue", ""); 
      var httpContextBase = new HttpContextWrapper(httpContext); 

      RouteTable.Routes.MapRoute(
       "RouteName", 
       "Area/{controller}/{action}/{id}/{OtherRoute}", 
       new {action = "Index", id = UrlParameter.Optional, OtherRoute = UrlParameter.Optional}); 

      RouteTable.Routes.EnableFriendlyUrls(); 

      var segments = new List<String> {"Controller", "Action", "Id", "OtherRoute"}; 


      using (ShimsContext.Create()) 
      { 
       ShimHttpContext.CurrentGet =() => httpContext; 

       ShimFriendlyUrl.SegmentsGet =() => segments; 

       // Act 
       RouteData result = MvcUtility.GetRouteValuesFromUrl(); 

       // Assert 
       Assert.IsNotNull(result, "Expected RouteData to be created."); 
      } 

     } 

Соответствующая часть тестируемой системы:

public static RouteData GetRouteValuesFromUrl() 
{ 
    var request = System.Web.HttpContext.Current.Request; 
    var segments = request.GetFriendlyUrlSegments(); 
    //Other code 
} 

Я бы ожидать для сегментов, чтобы использовать мой регулировочную шайбу получить и вернуть мой список сегментов ,

Мой код работает, когда я запускаю его в веб-контексте, мне просто нужно найти способ его протестировать, и первый шаг - насмешливое прошивка/заглушка этого запроса.GetFriendlyUrlSegments().

+2

Чтобы сделать код проверяемых, вы должны использовать инъекции 'HttpContextBase' вместо' HttpContext.Current'. – SLaks

+0

@Slaks. Это хороший момент, однако я не совсем понимаю, как это поможет мне перемыть вызов метода Request.GetFriendlyUrlSegments(). Можете ли вы уточнить? – twifosp

+1

Хм; глядя дальше, это не поможет здесь, если только реализация метода расширения GetFriendlyUrlSegments не использует данные, которые вы можете подделать. (попробуйте декомпилятор?) – SLaks

ответ

0

Основываясь на предположениях о скольжении, правильные данные для подделки здесь - Request.RequestContext.RouteData. Для этого необходим DataToken с ключом «FriendlyUrlSegments».

Скорректированный и работает тест:

var httpContext = TestHelper.StubHtppContext("", "http://localhost/content.aspx/area/controller/action/OtherRouteValue", ""); 
     var httpContextBase = new HttpContextWrapper(httpContext); 

     RouteTable.Routes.MapRoute(
      "RouteName", 
      "Area/{controller}/{action}/{id}/{OtherRoute}", 
      new {action = "Index", id = UrlParameter.Optional, OtherRoute = UrlParameter.Optional}); 

     RouteTable.Routes.EnableFriendlyUrls(); 

     var segments = new List<String> {"Controller", "Action", "Id", "OtherRoute"}; 

     var requestContext = new StubRequestContext(httpContextBase, new RouteData()); 

     var mockedRouteData = new RouteData(); 
     mockedRouteData.DataTokens.Add("FriendlyUrlSegments", segments); 

     requestContext.RouteDataGet =() => mockedRouteData; 

     using (ShimsContext.Create()) 
     { 
      ShimHttpContext.CurrentGet =() => httpContext; 
      ShimHttpRequest.AllInstances.RequestContextGet = request => requestContext; 

      // Act 
      RouteData result = MvcUtility.GetRouteValuesFromUrl(); 

      // Assert 
      Assert.IsNotNull(result, "Expected RouteData to be created.");