AttributeRouting does not work with an HttpConfiguration object to write integration tests

I create 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 manually created HttpConfiguration object, I get the following error: Msgstr "Restriction record" inboundHttpMethod "on the route with the route pattern 'api / Contacts / {id}' must have a string value or be a type that implements" IHttpRouteConstraint "

Code Example: 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 in the line "client.SendAsync". I checked config.Routes and the data type for "Constraints" for "inboundHttpMethod" is AttributeRouting.Web.Http.WebHost.Constraints.InboundHttpMethodConstraint It looks like a string value is expected. Any help would be greatly appreciated.

+8
asp.net-web-api asp.net-web-api-routing attributerouting
source share
1 answer

There was the same problem. Found the answer here:

https://github.com/mccalltd/AttributeRouting/issues/191

You need to replace

 AttributeRoutingHttpConfig.RegisterRoutes(config.Routes); 

from

 config.Routes.MapHttpAttributeRoutes(cfg => { cfg.InMemory = true; cfg.AutoGenerateRouteNames = true; cfg.AddRoutesFromAssemblyOf<ContactsController>();// Or some other reference... }); 

I also found that I also need the AutoGenerateRouteNames part.

+14
source

All Articles