如何使用 MediatR 进行测试

Posted

技术标签:

【中文标题】如何使用 MediatR 进行测试【英文标题】:How to test with MediatR 【发布时间】:2016-11-12 19:41:50 【问题描述】:

我刚刚开始测试 MediatR 以清理我们繁重的网络控制器。实现它自己的功能一点也不难,但我在测试方面有点挣扎。

我开始使用一个控制器方法来取消订单。

当订单被取消时,我们在哪里

在数据库中的数据上设置“已取消”标志 在审核日志中记录谁取消了会议 通过电子邮件向某个主管发送通知。

所有这些都是在控制器方法内部触发的,使得控制器依赖于几个不同的服务。测试时,我们必须模拟每个部分以隔离我们想要测试的行为。

我用MediatR 实现这个的方式是从控制器方法发出一个CancelOrder-query。然后我创建了一个CancelOrderHandler,负责存储“已取消”标志。

使用自定义MediatorPipeline-实现,如果CancelOrderHandler 没有引发任何异常,我会发出OrderCancelled-通知。

我有两个处理此通知的处理程序:OrderCancelledAuditLogHandlerOrderCancelledNotificationHandler。第一个负责审核日志,第二个负责发送通知。

每个处理程序都易于测试。但是我怎样才能测试所有东西都“合身”呢?我想确保当订单被取消时,审核日志和通知实际上得到了处理。在我的测试执行过程中,所有处理程序都会做我真正不想要的事情(数据库写入和电子邮件发送),而且我并不热衷于全面的端到端集成测试。

有什么想法吗?

【问题讨论】:

您能否发布一些代码 - 您的处理程序,以及您如何调度等...? 那里没什么有趣的,我想...我遵循了 Bogards blog post 的模式并使用 IoC 容器来装饰所有 IRequestHandler<>s 以发送后期事件。 【参考方案1】:

我正在处理同样的问题。我倾向于单独测试处理程序中使用的每个组件,然后构建它,不知何故还不能 100% 确定,我测试请求和处理程序的方式与 Bogard 先生测试的方式相同GitHub 上的 Mediatr 项目

【讨论】:

我正在考虑使用特殊的post-notification-handlers 和某种message relay 来构建“消息图”。因此,可以将处理程序标记为消息的发布通知处理程序(如事件后处理程序),并且可以将此类处理程序实现为send another message-handler。我希望能够基于 ioc 找到的类建立一个处理程序的“链”,然后对它们进行断言。我认为这比实际执行链条要好。

以上是关于如何使用 MediatR 进行测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FluentAssertions 在 XUnit 中测试 MediatR 处理程序

如何使用FluentAssertions在XUnit中测试MediatR处理程序

MediatR 和 CQRS 测试。如何验证调用了该处理程序?

Mediatr:单元测试行为/验证

如何装饰 MediatR 处理程序

如何取消 MediatR 发送的查询?