ApiControllerAttribute 如何影响单元测试?

How does ApiControllerAttribute affect unit test?

在 asp.net 核心 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 并为其实际调用被测操作成为测试的一部分。

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

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

属性提供的功能在孤立的单元测试中不可用,测试在执行时需要考虑预期行为。