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.
asp.net-web-api asp.net-web-api-routing attributerouting
Abhijeet patel
source share