Testeando Rutas con MoQ

Algunas semanas atrás junto a Edgardo Rossetto presentamos el nuevo framework MVC para desarrollo web. Si te acordás, parte de la presentación contaba cómo el engine de Rutas nos permitía realizar test unitarios sobre las mismas, permitiéndonos controlar el acceso a nuestras acciones en el controlador.

Durante la previa a la presentación, Edgardo escribió el código que te copio más abajo. En él se muestra un test sobre una ruta utilizando un framework de Mocking llamado Moq.

 

    1:  [TestClass]
    2:  public class HomeControllerFixture
    3:  {
    4:      [TestMethod]
    5:      public void ShouldRouteToDefaultAction()
    6:      {
    7:          RouteCollection routes = new RouteCollection();
    8:          RouteManager.RegisterRoutes(routes);
    9:   
   10:          var request = new Mock<IHttpRequest>();
   11:          request.Expect(x => x.AppRelativeCurrentExecutionFilePath).Returns("~/Default.aspx");
   12:          request.Expect(x => x.PathInfo).Returns(String.Empty);
   13:          request.Expect(x => x.HttpMethod).Returns("GET");
   14:   
   15:          var context = new Mock<IHttpContext>();
   16:          context.Expect(x => x.Request).Returns(request.Object);
   17:   
   18:          RouteData routeData = routes.GetRouteData(context.Object);
   19:   
   20:          Assert.IsNotNull(routeData);
   21:          Assert.AreEqual("Home", routeData.Values["controller"]);
   22:          Assert.AreEqual("Index", routeData.Values["action"]);
   23:      }
   24:  }

Fijate cómo al utilizar un framework de Mocking, no es necesario crear clases Mock que implementen las interfaces necesarias para definir el contexto en el cual funciona el engine de Rutas. Las rutas son definidas para un IHttpContext, pero no se trata del Contexto real.

Más adelante escribiré un articulo contando un poco sobre TDD. Es un tema que me gusta mucho, y del cual probablemente esté hablando frecuentemente, así que viene bien un post al cual linkear.

Saludos!