AttributeRouting not working with HttpConfiguration object for writing Integration tests
asp.net-web-api, asp.net-web-api-routing, attributerouting
Solution
Had the same problem. Found the answer here:
https://github.com/mccalltd/AttributeRouting/issues/191
You need to replace
AttributeRoutingHttpConfig.RegisterRoutes(config.Routes);
with
config.Routes.MapHttpAttributeRoutes(cfg =>
{
cfg.InMemory = true;
cfg.AutoGenerateRouteNames = true;
cfg.AddRoutesFromAssemblyOf<ContactsController>();// Or some other reference...
});
I found I also needed the AutoGenerateRouteNames part, too.
Problem
I'm creating some integration tests following the ideas outlined here: http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/ When I try to register routes from a hand crafted HttpConfiguration object I'm getting the following error: "The constraint entry 'inboundHttpMethod' on the route with route template 'api/Contacts/{id}' must have a string value or be of a type which implements 'IHttpRouteConstraint'." Sample code: Controller: ``` [RoutePrefix("api")] public class ContactsController : ApiController { [GET("Contacts/{id}",RouteName="GetContactsById")] public ContactDTO Get(int id) { return new ContactDTO{ ID =1, Name="test"}; } } } ``` TestClass (MSTest): ``` [TestClass] public class ContactsTest { private string _url = "http://myhost/api/"; private static HttpConfiguration config = null; private static HttpServer server = null; private HttpRequestMessage createRequest(string url, string mthv, HttpMethod method) { var request = new HttpRequestMessage(); request.RequestUri = new Uri(_url + url); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv)); request.Method = method; return request; } private HttpRequestMessage createRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class { HttpRequestMessage request = createRequest(url, mthv, method); request.Content = new ObjectContent<T>(content, formatter); return request; } [ClassInitializeAttribute] public static void ClassInitialize(TestContext ctx) { config = new HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; config.Services.Replace( typeof(IDocumentationProvider), new DocProvider()); config.Services.Replace( typeof(IApiExplorer), new VersionedApiExplorer(config)); config.Services.Replace( typeof(IHttpControllerSelector), new VersionHeaderVersionedControllerSelector (config) ); AttributeRoutingHttpConfig.RegisterRoutes(config.Routes); WebApiConfig.Register(config); server = new HttpServer(config); } public static void ClassCleanup() { config.Dispose(); server.Dispose(); } [TestMethod] public void RetrieveContact() { var request = createRequest("Contacts/12","application/json",HttpMethod.Get); var client = new HttpClient(server); using (HttpResponseMessage response = client.SendAsync(request).Result) { Assert.IsNotNull(response.Content); } } } ``` The error occurs on the line "client.SendAsync". I inspected config.Routes and the datatype for the "Constraints" for ''inboundHttpMethod' ' is AttributeRouting.Web.Http.WebHost.Constraints.InboundHttpMethodConstraint It appears that a string value is expected. Any help would be much appreciated.