Как определить, когда шина в памяти завершила обработку всех сообщений во время теста?

#masstransit

#masstransit

Вопрос:

Я изо всех сил пытаюсь найти API для шины в памяти MassTransit, которая позволяет моему тесту знать, что все сообщения были использованы их соответствующими потребителями.

Если у меня есть шина, настроенная следующим образом:

 _bus = Bus.Factory.CreateUsingInMemory(cfg =>
{
    cfg.ReceiveEndpoint("server.fax.inbound.received", ep =>
    {
        InboundFaxReceivedConsumer.UseMessageRetry(ep);
        ep.Consumer(() => new InboundFaxReceivedConsumer(
            _db.Create(),
            new NullLogger<InboundFaxReceivedConsumer>()));
    });
});
  

тогда я хотел бы иметь возможность сделать что-то вроде этого:

 _bus.Start();
_controller.Post(xml); // controller post is gonna publish a message
_bus.WaitForInactivity(); // <-- this is what I don't know how to do
_bus.Stop();
  

Ответ №1:

Если вы хотите проверить, что сообщения действительно были использованы, вам следует использовать InMemoryTestHarness, у которого есть методы для наблюдения за потребителями и обеспечения того, чтобы сообщения были использованы. После того, как тестовые утверждения пройдут (или, ну, потерпят неудачу), вы можете остановить тестовый жгут.

Пример потребительского теста приведен в модульных тестах: https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit .Тесты /Тестирование/ConsumerTest_Specs.cs

В вашем случае вы бы настроили жгут для своего потребителя:

 var harness = new InMemoryTestHarness();
var consumer = _harness.Consumer<InboundFaxReceivedConsumer>();
  

Затем, после вызова вашего Post метода контроллера, вы должны дождаться, пока потребитель получит и обработает сообщения:

 Assert.That(consumer.Consumed.Select<InboundFaxReceived>().Any(), Is.True);
  

Ответ №2:

Другое решение, если трудно принять потребителя:

 _harness.Consumed.Select<InboundFaxReceived>().ToList()