.net 我应该在WebAPI核心中测试CQRS处理程序还是整个请求输出

.net 我应该在WebAPI核心中测试CQRS处理程序还是整个请求输出,.net,asp.net-web-api,asp.net-core,cqrs,mediatr,.net,Asp.net Web Api,Asp.net Core,Cqrs,Mediatr,我创建Web API已经有一段时间了,很高兴能够测试CQRS处理程序(使用Mediatr管理),而不涉及任何类型的基础结构代码(控制器、请求等)。这是完全有道理的,因为我的控制器非常瘦,因为它们正在做控制器应该做的事情:请求和响应之间的通信: [HttpGet("requests")] public async Task<IEnumerable<AbsenceRequest>> GetAbsenceRequests(GetAbsenceRequests.Q

我创建Web API已经有一段时间了,很高兴能够测试CQRS处理程序(使用Mediatr管理),而不涉及任何类型的基础结构代码(控制器、请求等)。这是完全有道理的,因为我的控制器非常瘦,因为它们正在做控制器应该做的事情:请求和响应之间的通信:

    [HttpGet("requests")]
    public async Task<IEnumerable<AbsenceRequest>> GetAbsenceRequests(GetAbsenceRequests.Query query)
    {
        return await _mediator.Send(query);
    }
[HttpGet(“请求”)]
公共异步任务GetAbscenceRequests(GetAbscenceRequests.Query)
{
返回wait\u mediator.Send(查询);
}
但仍然有一些案例我的处理者测试没有涵盖。这里有几个例子:

  • 授权。我无法测试是否有“错误”的用户试图访问 具体操作,他收到拒绝访问错误。换句话说,我无法测试特定操作的授权属性
  • 错误处理。我可以检查我的处理程序是否抛出了特定的 在特定条件下出现异常,但我无法控制如何进行 基础设施(即异常中间件)处理此异常 (即导致了一个特定的HTTP错误)
  • ASP.NET Core使请求-响应-输出集成测试非常容易(多亏了TestServer),我可以在集成测试中介绍这两种情况

    困扰我的问题是,我是否应该通过发送请求并断言响应来保持处理程序测试或测试操作

    我真的很喜欢Handler测试。它们可爱、清晰、易于书写。测试整个请求的功能要强大得多,但同时也比较混乱,因为这是一种相对低级的方法,您必须处理http和json


    我觉得这个选择非常令人困惑,我想知道推荐的方法是什么。

    保留测试,因为“它们很可爱”,我不会真的用它作为论据

    你为什么要考试

    • 确保交付的软件正常工作(如NASA宇宙飞船软件)
    • 减少事后修复bug的时间
    • 缩短完成项目的时间
    自动化测试非常棒,因为它们可以一致地捕获bug。但是,如果测试只容易编写,并且没有其他好处,我会说它们是无用的,您应该删除它们

    另一方面,自动化单元测试肯定有自己的位置。因为它们在开发时捕捉到bug,所以最容易、最快地修复。当您仅在发布时运行测试,或者仅在ci构建中才可能运行测试时,缺点是开发人员必须“再次”处理此问题


    作为经验丰富的软件工程师/项目负责人,您需要决定什么对您的项目最有好处。

    我将使用单元测试测试您的处理程序,因为这些测试可以运行得更快,并且应该比通过MVC测试处理程序更不脆弱。没有充分的理由将处理程序的所有测试与当前的MVC实现结合起来。在决定是编写单元测试还是集成测试时,问题应该是“我可以用单元测试来测试吗?”如果答案是肯定的,那么就编写单元测试


    现在,也就是说,使用
    TestServer
    在ASP.NET核心中进行集成测试是非常棒的(我写道)。有些事情是不能用单元测试(处理程序或控制器操作方法)来测试的,比如路由设置是否正确、MVC错误处理、过滤器或模型绑定。您应该编写测试来确认这种行为,使用集成测试和
    TestServer
    (如果您认为它们增加了价值,也就是说)。您不应该测试所有已经有单元测试的场景——那将是一种浪费。但是,您可以使用这种方法来验证单元测试无法验证的不同内容。

    感谢您提供了非常好的反馈!我只想纠正一件事。处理程序测试不是单元测试,而是集成测试(它们在内存数据库中进行)。因此,在不同规模的集成测试之间进行选择。但是我同意,尽管TestServer是多么优秀,我们应该通过它来测试我们不能在较低级别上测试的东西。