【问题标题】:How does ApiControllerAttribute affect unit test?ApiControllerAttribute 如何影响单元测试?
【发布时间】:2018-07-27 17:41:03
【问题描述】:

在 asp.net core 2.1 中引入了一些新功能,特别是 ApiControllerAttribute。与 CompatibilityVersion.Version_2_1 结合使用时,行为会发生一些变化。

其中一个变化是可以省略 ModelState 测试。如果没有 ApiControllerAttribute 我需要:

public ActionResult DoSomething([FromBody] SomeDto dto)
{
    if (!ModelState.IsValid)
        return BadRequest();

    return Ok("Done");
}

与 ApiControllerAttribute:

public ActionResult DoSomething([FromBody] SomeDto dto)
{
    return Ok("Done");
}

如果一个无效的 dto 将 automatically 导致一个 BadRequest。

但现在对于单元测试,这不起作用。如果我想测试一个控制器,那么在之前的情况下,当插入一个无效的 dto 时,单元测试会失败。但是在当前情况下,ModelState 没有经过验证,这意味着测试会成功。

所以我的问题是,我现在必须使用Integration Tests 来测试控制器吗?或者是否有其他方法可以基于 ApiControllerAttribute 获得相同的行为?

【问题讨论】:

  • ApiControllerAttribute 是仅在运行时相关的元数据,这意味着您必须在集成测试中使用 TestServer 并实际调用被测操作以使其成为测试。
  • 所以新功能实际上是一个突破性的变化?因为我们不能再对控制器使用单元测试了。
  • 它会影响您想要手动检查模型状态和模型状态错误的场景。
  • 但我猜他们现在将其视为横切关注点。
  • 如果使用自定义操作过滤器或由于模型状态错误直接从操作返回,它不会阻止您在控制器中仍然包含模型状态检查。你的第一个 sn-p 仍然是允许的。

标签: unit-testing asp.net-core-2.1


【解决方案1】:

ApiControllerAttribute 是仅在运行时相关的元数据,因此这意味着您必须在集成测试中使用 TestServer 并实际调用被测操作以使其成为测试的一部分。

它会影响单元测试在单独测试控制器操作时想要手动检查模型状态和模型状态错误的场景。

如果使用自定义操作过滤器或由于模型状态错误直接从操作返回,它不会阻止控制器中仍然包含模型状态检查。

该属性提供的功能在独立的单元测试中不可用,并且在执行预期行为时,测试需要考虑到这一点。

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2010-11-25
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2021-06-29
    • 2022-01-20
    相关资源
    最近更新 更多