我正在为 WebAPI Controller 编写一些单元测试,我想断言的方面之一是参数匹配。
我遵循了 Filip Wojcieszyn's blog 中使用的方法,工作正常,但我现在希望扩展其断言。
我在一个controller上有3个action(这3个action都经过实际使用验证):
[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”参数。
谁能解释为什么它只返回这个而不返回其他两个重载,以及是否有可能获得重载的可能性?
最佳答案
问题的原因是调用的路由不够具体。
- 我有一个允许 ID 参数可选的路由
- 在 Controller 上有 3 个 Get() 重载。
- 选择 Get(long id) 操作是因为虽然没有指定“id”参数,但“id”参数是可选的,因此适合此方法。
WebAPI 选择具有最多匹配参数的方法,在本例中这意味着在代码行
var descriptor = actionSelector.SelectAction(_controllerContext);
选择了一个意外的 Action - 意外是因为我正在寻找 Get() 并且被赋予了 Get(long id)。
为了解决这个问题,我简单地将我配置的路由分成两部分:第一个期望(即非可选)“id”参数,以及一个不接受“id”的更通用的路由' 参数。
然后一切就绪。
关于.net - WebAPI 中的单元测试操作参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12918328/