MassTransit 4 单元测试消费者超时

MassTransit 4 Unit Test Consumer timeout

我已经在 MT 3.5.7 中成功地将此测试模式与 sagas 一起使用,但现在在 MT 4.0 中测试消费者时,我正在使用 InMemoryTestHarness 来测试来自消费者的消息的发布。

通过测试调试单步执行我可以看到消费者被正确调用并发布了消息。消费者除了接收消息和发布新消息外什么都不做。

但是等待已发布消息的 _harness.SubscribeHandler 超时。

为了简洁起见,下面的代码删除了我的容器注册和测试数据设置。

[TestFixture]
public class ConsumerTest
{
    InMemoryTestHarness _harness;
    ConsumerTestHarness<TCommandConsumer> _consumer
    ConsumeContext<ConsumerCompleted> _resultHandler;

    [OneTimeSetup]
    public async Task TaskSetup()
    {
      IContainer _container;
      //...container registrations and test data setup

      _harness = new InMemoryTestHarnes();
      _consumer = _harness.Consumer<TCommandConsumer>( () => _container.Resolve<TCommandConsumer>() );
      await _harness.Start();
      await _harness.InputQueueSendEndpoint.Send(new TCommand { Source = testdataSource, Topic = testdataTopic });
     _resultHandler = await _harness.SubscribeHandler<ConsumerCompleted>(); //Timeout here
    }

命令使用者 (TCommandConsumer) 成功接收到从 InputQueueSendEndpoint.Send 发送的命令并发布其响应 (ConsumerCompleted) 但我无法在测试夹具中处理该命令.

我在这里错过了什么?

在 MassTransit 4 中,内存消息结构的行为与 RabbitMQ 相同。以前,内存中会将每条消息发布到每个端点,无论是否存在该消息类型的绑定。现在,如果没有绑定,则不会传递消息。

因此您需要创建另一个接收端点而不是使用 SubscribeHandler<T>,并使用 Handled<T> 检查消息是否已发布和接收。

或者,您可以只使用消费者测试工具上的 _consumer.Published.Select<T>.Any() 查看它是否发布了事件,而不是检查它是否被消费。