Web API中的单元测试操作参数

时间:2012-10-16 15:35:45

标签: .net unit-testing asp.net-web-api url-parameters controller-action

我正在为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”参数。

任何人都可以解释为什么它只返回这个以及其他两个重载都没有,并且是否有可能获得过载的可能性?

1 个答案:

答案 0 :(得分:3)

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

  • 我有一条允许ID参数可选的路线
  • 在控制器上有3次重载Get()。
  • 选择了Get(long id)操作,因为虽然未指定'id'参数,但'id'参数是可选的,因此此方法适合。

WebAPI选择具有最多匹配参数的方法,在这种情况下意味着在代码行上

var descriptor = actionSelector.SelectAction(_controllerContext);

正在选择意外的操作 - 意外,因为我正在寻找Get()并获得Get(长ID)。

要解决此问题,我只需将配置的路由拆分为两个:第一个预期(非可选)一个'id'参数,以及一个不接受'id的更一般的路由'参数。

然后一切都落到了位置。