Masstransit 如何测试/调试没有响应的消费者?

Posted

技术标签:

【中文标题】Masstransit 如何测试/调试没有响应的消费者?【英文标题】:Masstransit how to test / debug a consumer which doesn't response? 【发布时间】:2022-01-15 07:47:42 【问题描述】:

在测试项目中我想执行CallbackReceivedEventHandler中的代码 所以我试图向这个消费者“发布”一些东西,但最终消费者没有被调用。我做错了什么?

我必须让消费者响应一些东西,然后在测试项目中使用 RequestClient...这不是一个好的解决方法...消费者不应该响应任何东西

请帮忙

应用项目

public class CallbackReceivedEventHandler : IConsumer<CallbackReceivedEvent>

    public async Task Consume(ConsumeContext<CallbackReceivedEvent> context) 
    
        //Breakpoint is here
        ...
        await context.RespondAsync(new CallbackReceivedEventResponse()); // I want to remove this thing
    

测试项目

provider = new ServiceCollection()
    .AddMassTransitInMemoryTestHarness(cfg =>
    
        configurator.AddConsumers(typeof(CallbackReceivedEventHandler));
    )
    .AddGenericRequestClient()
    .BuildServiceProvider(true);

var harness = provider.GetRequiredService<InMemoryTestHarness>();
await harness.Start();

var bus = provider.GetRequiredService<IBus>();

CallbackReceivedEvent input = new()

// NOT WORK
await bus.Publish(input); //KO! the consumer is not called (breakpoint in Consume is not hit)

// WORK!
var requester = bus.CreateRequestClient<CallbackReceivedEvent>();
await requester.GetResponse<CallbackReceivedEventResponse>(input); //OK! the consumer is called (breakpoint in Consume is hit)

【问题讨论】:

【参考方案1】:

您的测试很可能在消息发送给消费者之前完成。消息是异步传递的。

在您的测试中,发布后,您可以等待测试工具上的 InactivityTask 以确保消息已发送。或者您可以等待消息被使用。任何一种方法都有效,但一种更具体的方法是确保消息已发布。

await bus.Publish(input);

await harness.Consumed.Any<CallbackReceivedEvent>();

【讨论】:

以上是关于Masstransit 如何测试/调试没有响应的消费者?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 和 MassTransit 之间的连接

在使用 MassTransit 进行集成测试期间模拟 IRequestClient<>

fiddler断点测试修改响应指令有啥作用

MassTransit.QuartzIntegration.ScheduledMessageJob:无法实例化没有空构造函数的类型(参数'ScheduledMessageJob')'

如何在实体框架中持久保存 MassTransit 状态数据?

如何托管MassTransit和RabbitMq