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



我正在为 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();

问题是当我调用描述符时。GetParameters() 在无参数路由上,它返回一个包含 1 个参数的集合 - "long id"参数。

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

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

  • 我有一条允许 ID 参数是可选的路由
  • 控制器上有 3 个 Get() 重载。
  • 之所以选择 Get (long id) 操作,是因为尽管没有指定"id"参数,但"id"参数是可选的,因此此方法适合。

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

var descriptor = actionSelector.SelectAction(_controllerContext);

选择了意外的操作 - 出乎意料,因为我正在寻找 Get() 并被赋予了 Get(长 id)。

为了解决这个问题,我简单地将我配置的路由一分为二:第一个期望(非可选)一个"id"参数,以及一个不接受"id"参数的更通用的路由。

然后一切都到位了。

最新更新