我创建 Web API 已经有一段时间了,很高兴能够测试 CQRS 处理程序(由 Mediatr 管理)而不涉及任何类型的基础设施代码(控制器、请求等)。作为我的控制器,它完全有意义非常瘦,因为他们正在做控制器应该做的事情:请求和响应之间的通信:
[HttpGet("requests")]
public async Task<IEnumerable<AbsenceRequest>> GetAbsenceRequests(GetAbsenceRequests.Query query)
{
return await _mediator.Send(query);
}
但仍有一些情况是我的 Handlers 测试没有涵盖的。这里有几个例子:
- 授权。我无法测试“错误”用户是否尝试访问特定操作,他收到拒绝访问错误。换句话说,我无法测试特定操作的授权属性。
- 错误处理。我可以检查我的处理程序是否在特定条件下引发了特定异常,但我无法控制基础设施(即异常中间件)如何处理此异常(即导致特定 HTTP 错误)。
ASP.NET Core 使请求输入响应输出集成测试变得非常容易(感谢 TestServer),我可以在集成测试中涵盖这两种情况。
困扰我的问题是我是否应该通过发送请求和断言响应来保持 Handlers 测试或测试操作。
我真的很喜欢 Handler 测试。它们很可爱,清晰且易于书写。测试整个请求更强大,但同时也更混乱,因为它是一种相对低级的方法,您必须处理 http 和 json。
我发现这个选择非常令人困惑,想知道推荐的方法是什么。