Timeout with MassTransit IRequestClient


public class CarCreatedConsumer: IConsumer<CarCreatedEvent>
{
private readonly IMediator _mediator;
public CarCreatedConsumer(IMediator mediator)
{
_mediator = mediator;
}
public async Task Consume(ConsumeContext<CarCreatedEvent> context)
{
var command = new SendEmailCommand(context.Message.Details);
bool success = await _mediator.Send(command);
if(!success)
{ 
return new Exception("There was an error!")
}
}
}

调试中的SendEmailCommandHandler成功地接收到命令,并用模拟存储库处理它(我隐藏了这些细节,因为我认为它与这个问题无关(,但在测试时,我仍然在client.GetResponse<CarCreatedEvent>中获得TimeOutException

以下是我如何在masstransit单元测试消费者文档之后设置测试

public class MyTests
{
private ITestHarness _harness;
private ServiceProvider _provider;
[SetUp]
public void SetUp()
{
_provider = new ServiceCollection()
.AddMassTransitTestHarness(cfg =>
{
cfg.AddConsumer<CarCreatedConsumer>();
cfg.AddHandler<SendEmailCommand>(context => context.RespondAsync(true));
})
.AddMediatR(options =>
{
options.AsTransient();
}, Assembly.GetAssembly(typeof(CarCreatedConsumer)))
.BuildServiceProvider(true);
_harness = _provider.GetRequiredService<ITestHarness>();
}
[Test]
public async Task ShouldRespond()
{
await _harness.Start();
var client = _harness.GetRequestClient<CarCreatedEvent>();
try
{
await client.GetResponse<CarCreatedEvent>(new
{
Id = 1,
CarOwnerName = "John"
});
}catch (Exception e)
{ 
**// Getting TimeoutException here!**
throw;
}

Assert.IsTrue(await _harness.Sent.Any<CarCreatedEvent>());
Assert.IsTrue(await _harness.Consumed.Any<CarCreatedEvent>());
var consumerHarness = _harness.GetConsumerHarness<CarCreatedEventHandler>();
Assert.That(await consumerHarness.Consumed.Any<CarCreatedEvent>());
}

同样,当我运行测试时,我能够点击consumer并从那里创建命令,该命令由其处理程序成功处理并保存到模拟存储库中,但我无法点击Assert行,因为我得到了TimeoutException。

您的消费者没有响应,这就是它超时的原因。消费者应该调用context.RespondAsync,并为请求客户端提供响应消息。

这些都包含在文档中。

最新更新