RouteEvaluator For Unit Testing Routes, mvc comments edit

A while back I wrote a routing debugger which is useful for testing your routes and seeing which routes would match a given URL. Rob suggested we have something like this for unit tests, so I whipped something simple up.

This is a class that allows you to test multiple different URLs quickly. You simply create the RouteEvaluator giving it a collection of routes and then GetMatches which returns a List<RouteData> containing a RouteData instance for every route that matches, not just the first one.

Here’s a sample of usage.

public void CanMatchUsingRouteEvaluator()
  var routes = new RouteCollection();

  var evaluator = new RouteEvaluator(routes);
  var matchingRouteData = evaluator.GetMatches("~/foo/bar");
  Assert.IsTrue(matchingRouteData.Count > 0);
  matchingRouteData = evaluator.GetMatches("~/foo/bar/baz/billy");
  Assert.AreEqual(0, matchingRouteData.Count);

And here’s the code. Note that my implementation relies on Moq, but you could easily implement it without using Moq if you wanted to.

public class RouteEvaluator
  RouteCollection routes;
  public RouteEvaluator(RouteCollection routes)
    this.routes = routes;

  public IList<RouteData> GetMatches(string virtualPath)
    return GetMatches(virtualPath, "GET");

  public IList<RouteData> GetMatches(string virtualPath, string httpMethod)
    List<RouteData> matchingRouteData = new List<RouteData>();

    foreach (var route in this.routes)
      var context = new Mock<HttpContextBase>();
      var request = new Mock<HttpRequestBase>();

      context.Expect(ctx => ctx.Request).Returns(request.Object);
      request.Expect(req => req.PathInfo).Returns(string.Empty);
      request.Expect(req => 
      if (!string.IsNullOrEmpty(httpMethod))
        request.Expect(req => req.HttpMethod).Returns(httpMethod);

      RouteData routeData = this.routes.GetRouteData(context.Object);
      if (routeData != null) {
    return matchingRouteData;

Let me know if this ends up being useful to you.

Technorati Tags: aspnetmvc,ASP.NET,routing