2

我正在为WebAPI控制器编写一些单元测试,并且我想断言的其中一个方面是参数匹配。WebAPI中的单元测试操作参数

我遵循Filip Wojcieszyn's blog中使用的方法,它工作正常,但我现在想要扩展它的断言。

我有三个动作控制器(其中三个已通过实际使用验证):

[HttpGet] 
public IEnumerable<Task> Get() 

[HttpGet] 
public IEnumerable<Task> Get(string elementType) 

[HttpGet] 
public Task Get(long id) 

和我有下面的代码

var actionSelector = new ApiControllerActionSelector(); 
var descriptor = actionSelector.SelectAction(_controllerContext); 
return descriptor.GetParameters(); 

的问题是,当我在无参数路由上调用descriptor.GetParameters()它返回一个包含1个参数的集合 - “long id”参数。

任何人都可以解释为什么它只返回这个和其他两个重载,如果有可能获得超载的可能性?

回答

3

问题的原因是被调用的路由不够具体。

  • 我有这使得ID参数是可选的
  • 在控制器的路由是获取的3个重载()。
  • Get(long id)action被选中,因为虽然没有指定'id'参数,'id'参数是可选的,因此这个方法适合。

的的WebAPI选择具有最大数目的匹配参数的,在这种情况下意味着对

var descriptor = actionSelector.SelectAction(_controllerContext); 

正在选择的一个意外的操作的代码行的方法 - 出乎意料的,因为我正在寻找Get()并被给予Get(long id)。

为了解决这个我简单我的配置的路由分成两个:第一个期望(即非可选)的“ID”参数,以及其中不接受的“id”参数的更一般的路线。

然后一切都落空了。

+0

这正是发生在我身上的事情。 – Skadoosh

+0

您是否在默认路线之前或之后放置了该路线?我有2个测试,一个命中Get(),另一个命中Get(id)。如果我在默认路由之前放置路由,则第二次测试失败。如果我在默认路由后放置路由,则第一个测试失败。 – Skadoosh

+0

您的默认路线应该是最后一个路线,因为默认路线应该是最一般的路线。 – awj