Unit Testing ASP.NET Web API

This is one of those things that I encounter now and then and always forgot how to do. I have to search the web and most of the results are for ASP.NET MVC, not for Web API. This time I found the solution on http://www.peterprovost.org/blog/2012/06/16/unit-testing-asp-dot-net-web-api/ and decided to document it.

var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Get, "http://host/api/my");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "my" } });
var controller = new MyController();
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

I’m not sure you need the route stuff, but the config is needed.

Another variant of this is constructing an HttpRequestMessage that be passed to the UrlHelpeconstructor:

var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Get, "http://host/2.2/api/se/15/controller");
var route = config.Routes.MapHttpRoute(
            name: RoutesConstants.IncludeResourceSpecificOptionsRouteName,
            routeTemplate: "api/{country}/{deviceVersion}/{controller}/{id}",
            defaults:
                new
                {
                    id = RouteParameter.Optional,
                    country = RouteParameter.Optional,
                    deviceVersion = RouteParameter.Optional
                });
request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
var urlHelper = new UrlHelper(request);

Another related problem is if the controller accesses HttpContext.Current.Request. That you can just assign:

HttpContext.Current = new HttpContext(new HttpRequest(null, "http://someurl", null), new HttpResponse(new StringWriter()));

Getting Version Info from Assembly

Here is a code snippet to get assembly name, assembly version and product version from the executing assembly:

var assembly = Assembly.GetExecutingAssembly();
var assemblyName = assembly.GetName().Name;
var assemblyVersion = assembly.GetName().Version.ToString();
var productVersion = FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;