【发布时间】: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