2015-08-19 3 views
1

Я использую этот код:маршрутизации и интеграционное тестирование WebAPI через selfhosting

[Fact] 
public void ValueController_WithGetMethos_ShouldReturnValidData_NoBaseClass() 
{ 
    var configuration = new HttpSelfHostConfiguration("http://localhost:64466"); 
    configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
    configuration.Services.Replace(typeof(IAssembliesResolver), new WebApiClassBase.TestAssemblyResolver(typeof(ValuesController))); 

      configuration.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

    var server = new HttpSelfHostServer(configuration); 
    try 
    { 
    server.OpenAsync().Wait(); 

    var request = new HttpRequestMessage 
    { 
     RequestUri = new Uri("http://localhost:64466/api/values"), 
     Method = HttpMethod.Get 
    }; 

    var client = new HttpClient(server); 
    using (HttpResponseMessage response = client.SendAsync(request).Result) 
    { 
     response.Should().Not.Be.Null(); 
     response.IsSuccessStatusCode.Should().Be.True(); 

     string[] result = response.Content.ReadAsAsync<string[]>().Result; 

     result.Length.Should().Be.EqualTo(4); 
     result[0].Should().Be.EqualTo("http://tostring.it"); 
     result[1].Should().Be.EqualTo("http://imperugo.tostring.it"); 
     result[2].Should().Be.EqualTo("http://twitter.com/imperugo"); 
     result[3].Should().Be.EqualTo("http://www.linkedin.com/in/imperugo"); 
    } 
    } 
    finally 
    { 
    configuration.Dispose(); 
    server.Dispose(); 
    } 
} 

Вдохновленный this, который также содержит соответствующие ValuesController. Я заметил, что мне пришлось адаптировать маршрутизацию:

configuration.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

по одному в моем WebApiConfig. Тем не менее, когда я пытаюсь получить доступ к Action с маршрутизацией атрибутов следующим образом:

Route("Calculator/AddTwoNumbers/a/{a}/b/{a}")] 
public IHttpActionResult AddTwoNumbers(PayLoad payLoad) 

Я получаю ошибку 404 - Не найдена. Должен ли я также определять эту декларативную маршрутизацию? Если это так, тестирование интеграции кажется довольно утомительным. Любая обратная связь будет очень оценена. Благодарю.

PS:

Я пробовал:

configuration.MapHttpAttributeRoutes(); 

, не похоже, чтобы помочь

+0

Был ли вы «MapHttpAttributeRoutes» до или после добавления маршрута по умолчанию? (вам нужно сделать это раньше) – crush

+0

благодарит за комментарий. после. – cs0815

+0

Спасибо. Это исправлено, пожалуйста, напишите ответ, если хотите. – cs0815

ответ

0

Вам нужно настроить AttributeRouting прежде, чем маршрут по умолчанию настроен.

configuration.MapHttpAttributeRoutes(); 
configuration.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Маршруты оцениваются в порядке их добавления к RouteCollection. Если сначала выбран маршрут по умолчанию, он будет соответствовать входящим маршрутам, прежде чем ваши маршруты атрибутов будут соответствовать.

Смежные вопросы