Asp.net-Web-Api

AttributeRouting 不適用於編寫集成測試的 HttpConfiguration 對象

  • September 30, 2013

我正在按照此處概述的想法創建一些集成測試: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 部分。

引用自:https://stackoverflow.com/questions/18778390