ApiControllerAttribute如何影响单元测试?

时间:2018-07-25 15:25:47

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

在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获得相同的行为?

1 个答案:

答案 0 :(得分:1)

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

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

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

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