#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()