0

내 컨트롤러의 방법으로 라우팅을 테스트하려고합니다.컨트롤러 라우팅, HttpRequestMessage를 사용하여 데이터를 게시하는 방법

[HttpPost] 
public PlaylistItemDto Create(PlaylistItemDto playlistItemDto) 

[HttpPost] 
public IEnumerable<PlaylistItemDto> CreateMultiple(List<PlaylistItemDto> playlistItemDtos) 

내가했다 : 내 컨트롤러는 다음 두 서명 사이에 결정을 내릴 수 있도록 메시지와 함께 콘텐츠를 게시 할 수 있어야합니다

[Test] 
public void POST_PlaylistItem_Should_route_to_PlaylistItemController_Create_method() 
{ 
    var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/PlaylistItem/"); 

    var config = new HttpConfiguration(); 

    WebApiConfig.Register(config); 
    var route = Helpers.RouteRequest(config, request); 

    route.Controller.Should().Be<PlaylistItemController>(); 
    route.Action.Should().Be("Create"); 
} 

: 나는 다음과 같은 단위 테스트있어 일부 리소스를 살펴보면 async + HttpClient, http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client#PostingResource을 사용하여 예제를 찾았지만 기본적인 작업을 수행 할 때까지 익숙하지 않은 기술로 예제를 과도하게 작성하는 데 열중하지 않았습니다. HttpClient를 사용하여 컨트롤러에 메시지를 쉽게 보낼 수 없었습니다/서버가 실행되고 있지 않은 것처럼 행동했습니다.

+0

것은이는 "둘 사이에 결정을 할"것 컨트롤러 아니다이며, 어디에서 오는지. ASP.NET 웹 API의 라우팅 인프라입니다. 당신은 (App_Start에서) 웹 API의 라우팅을 구성 했으므로 - HTTP 컨텍스트 나 서버 아키텍처가 없기 때문에 어떤 메소드를 호출해야하는지 알 수 없기 때문에, 실제로 찾고있는 것은 통합 테스트뿐입니다. 우리가 라우팅을 테스트 할 준비 웹 서버에 우리는 단지 스크립트 (wget과 또는 셀레늄, 또는 뭔가) HTTP 요청을 올바르게 발생합니다. –

답변

1

좋아, 나는 그것을 알아 낸 얻었다. 내가 속성 기반하는 것이 바람직하다 라우팅을 변환하지 않습니다, 그러나 이것은 좋은 시작 예를 들어 역할 :

목표는 /이 두 메소드 서명이 충돌하지 않는 것을 테스트 웹 API를 혼동하는 것입니다

내 WebApiConfig 클래스에서
[HttpPost] 
public PlaylistItemDto Create(PlaylistItemDto playlistItemDto) 

[HttpPost] 
public IEnumerable<PlaylistItemDto> CreateMultiple(List<PlaylistItemDto> playlistItemDtos) 

는 :

config.Routes.MapHttpRoute(
    name: "Create", 
    routeTemplate: "PlaylistItem", 
    defaults: new 
    { 
     controller = "PlaylistItem", 
     action = "Create" 
    } 
); 

config.Routes.MapHttpRoute(
    name: "CreateMultiple", 
    routeTemplate: "PlaylistItem/CreateMultiple", 
    defaults: new 
     { 
      controller = "PlaylistItem", 
      action = "CreateMultiple" 
     } 
); 

이 PlaylistItem 단지 액션의 이름으로 아무것도 작성 작업에 전달 될 것이라고 말했다. PlaylistItem/CreateMultiple은 CreateMultiple 액션으로 라우팅됩니다.

그런 다음이 작동하는지 확인합니다 :

[Test] 
public void POST_PlaylistItem_Should_route_to_PlaylistItemController_Create_method() 
{ 
    // setups 
    var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/PlaylistItem/"); 

    var config = new HttpConfiguration(); 

    // act 
    WebApiConfig.Register(config); 
    var route = Helpers.RouteRequest(config, request); 

    // asserts 
    route.Controller.Should().Be<PlaylistItemController>(); 
    route.Action.Should().Be("Create"); 
} 

[Test] 
public void POST_CreateMultiple_PlaylistItem_Should_route_to_PlaylistItemController_CreateMultiple_method() 
{ 
    // setups 
    var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/PlaylistItem/CreateMultiple"); 

    var config = new HttpConfiguration(); 

    // act 
    WebApiConfig.Register(config); 
    var route = Helpers.RouteRequest(config, request); 

    // asserts 
    route.Controller.Should().Be<PlaylistItemController>(); 
    route.Action.Should().Be("CreateMultiple"); 
} 

을 RouteRequest이 Testing route configuration in ASP.NET WebApi