0

我试图测试路由到我的Controller的方法。我有以下的单元测试:测试控制器路由,如何使用HttpRequestMessage发布数据

[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"); 
} 

我需要能够发布内容与消息让我的控制器可以使以下两个签名之间做出一个决定:

[HttpPost] 
public PlaylistItemDto Create(PlaylistItemDto playlistItemDto) 

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

我通过一些资源查找,我发现了一个使用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 Web API的路由基础结构。由于您只需配置(在App_Start中)Web API的路由,并且由于没有HTTP上下文或服务器体系结构,因此无法知道应该调用哪种方法 - 我要说的是您真正需要的是集成测试。 当我们想要测试路由是否正确发生时,我们只需将脚本(在wget或Selenium中)或HTTP请求发送到登台Web服务器。 –

回答

1

好的,我明白了。请注意,我还没有转化为基于属性的路由是可取的,但这个作为一个良好的开端例如:

目标是测试,这两个方法签名不冲突/混淆的Web API:

[HttpPost] 
public PlaylistItemDto Create(PlaylistItemDto playlistItemDto) 

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

在我WebApiConfig类:

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

相关问题