.net - WebAPI 中的单元测试操作参数

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

我正在为 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/

相关文章:

.net - 跨多个文件拆分 F# 模块

asp.net - 在 w3wp 进程之间共享程序集以减少内存使用

.NET 库/人群模拟书籍

.net - 处理小图像(<=4k 像素数据)时强制进行 GC?

c# - Web API OData - 使用 ODataModelBuilder 公开 ComplexType

asp.net - 更改 ASP.NET SPA 模板中的 ASP.NET 标识代码的原因?

django - 操作错误: no such table: django_content_type when using unittest

c# - 通过 Entity Framework BeginTransaction

c# - 如何对从数据库获取数据并将数据保存到文件的方法进行单元测试是否保存正确的数据

asp.net-web-api - 自定义身份验证asp.net core web api