Asp.net-Web-Api
AttributeRouting 不適用於編寫集成測試的 HttpConfiguration 對象
我正在按照此處概述的想法創建一些集成測試:http: //www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/
當我嘗試從手工製作的 HttpConfiguration 對象註冊路由時,出現以下錯誤:“使用路由模板 ‘api/Contacts/{id}’ 的路由上的約束條目 ‘inboundHttpMethod’ 必須具有字元串值或屬於一種實現 ‘IHttpRouteConstraint’ 的類型。”
範常式式碼:控制器:
[RoutePrefix("api")] public class ContactsController : ApiController { [GET("Contacts/{id}",RouteName="GetContactsById")] public ContactDTO Get(int id) { return new ContactDTO{ ID =1, Name="test"}; } } }測試類(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); } } }錯誤發生在“client.SendAsync”行。我檢查了 config.Routes 並且“inboundHttpMethod”的“約束”的數據類型是 AttributeRouting.Web.Http.WebHost.Constraints.InboundHttpMethodConstraint 似乎需要一個字元串值。任何幫助將非常感激。
有同樣的問題。在這裡找到了答案:
https://github.com/mccalltd/AttributeRouting/issues/191
你需要更換
AttributeRoutingHttpConfig.RegisterRoutes(config.Routes);和
config.Routes.MapHttpAttributeRoutes(cfg => { cfg.InMemory = true; cfg.AutoGenerateRouteNames = true; cfg.AddRoutesFromAssemblyOf<ContactsController>();// Or some other reference... });我發現我也需要 AutoGenerateRouteNames 部分。