我已将 MassTransit 配置为使用 LocalStack 进行本地开发。对于集成测试,我们的测试设置是使用尽可能多的依赖项的 Docker 映像,以使事情尽可能接近生产。
我创建了一个 TestConsumer 类。如果 WebApi 项目使用
AddConsumer<TestConsumer>()
作为 AddMassTransit(...)
调用的一部分,那么集成测试就可以正常工作 - 使用 localstack。
但是,WebApi 项目不应该向生产代码中添加测试内容。是的,我可以在注册周围有一个 if 语句,但这也是不好的做法(在我看来)。
我希望集成测试的
WebApplicationFactory.ConfigureWebHost(...)
方法能够针对消费者。在我看来,这是最好的,因为我们的 Api 项目中没有测试代码。
如果您多次调用 AddMassTransit(...)
,MassTransit 会抛出错误。有一个
AddMassTransitTestHarness(...)
方法,但该方法会删除所有 MassTransit 配置并将其替换为内存队列 - 绕过 localstack。
我不喜欢这个选项,因为我希望我的集成测试尽可能接近生产。我可以在
AddMassTransitTestHarness(...)
调用中重复注册,但这只会导致潜在的错误。我可以有一些共享的静态方法,使配置大部分保持在一个地方,如果我找不到更好的解决方案,那么我最终会走这条路。
有谁知道在
WebApplicationFactory.ConfigureWebHost(...)
中注册 MassTransit 消费者(和生产者)的内置方法,而无需重新进行所有 MassTransit 注册?
谢谢。
因此,如果您想向 WebApplicationFactory 添加临时使用者,您可以考虑尝试类似的操作。
var client = new WebApplicationFactory<Program>()
.WithWebHostBuilder(builder =>
{
builder.ConfigureServices(services =>
{
services.RegisterConsumer<AdHocTestConsumer>();
});
}).CreateDefaultClient();
这应该能让你得到我相信你正在寻找的东西。请注意,扩展方法
RegisterConsumer
位于命名空间 MassTransit.Configuration
中