3

我正在为 WebAPI 控制器编写一些单元测试,我想断言的方面之一是参数匹配。

我遵循了Filip Wojcieszyn 的博客中使用的方法,该方法运行良好,但我现在正在寻求扩展它的断言。

我在一个控制器上做了三个动作(这三个动作都经过实际使用验证):

[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”参数。

谁能解释为什么它只返回这个而不返回其他两个重载,以及是否有可能获得重载的可能性?

4

1 回答 1

3

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

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

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

var descriptor = actionSelector.SelectAction(_controllerContext);

选择了一个意外的操作 - 意外,因为我正在寻找 Get() 并获得了 Get(long id)。

为了解决这个问题,我简单地将我配置的路由分成两部分:第一个需要(非可选的)'id' 参数,以及不接受'id' 参数的更一般的路由。

然后一切都到位了。

于 2012-10-17T15:06:34.707 回答