MassTransit 4单元测试消费者超时

时间:2018-01-28 06:09:44

标签: c# unit-testing nunit masstransit

我已经在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),但我无法在测试夹具中处理。< / p>

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

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

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

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