Интеграционное тестирование микросервисов с использованием MassTransit

Я пытаюсь создать тесты интеграции черного ящика для некоторых служб, которые я создал с помощью MassTransit. Суть службы состоит в том, что она получает сообщение по каналу MassTransit, обрабатывает сообщение и отправляет сообщение по другому каналу MassTransit (обратите внимание, что это не семантика запроса-ответа, а скорее компонент конвейера):

IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost"),
        h =>
        {
            h.Username("guest");
            h.Password("guest");
        });

    cfg.ReceiveEndpoint(host, "Queue1", ep =>
    {
        ep.Handler<ItemStarted>(context =>
        {
            ItemFinished item = FinishMessage(context.Message);
            context.Publish(item); 
        });
    });
});

bus.Start();

Чтобы проверить это, я думаю, мне нужен синхронный способ получения сообщений с шины. Есть какой-либо способ сделать это:

IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
    var host = cfg.Host(new Uri("rabbitmq://localhost"),
        h =>
        {
            h.Username("guest");
            h.Password("guest");
        }));

bus.Start();

bus.Publish(new ItemStarted());

// This is what does not seem to exist
ItemFinished finished = bus.Receive<ItemFinished>(timeout : Timespan.FromSeconds(5));

// Assertions about finished

Есть ли способ получать сообщения напрямую из MassTransit без подключения класса потребителя или лямбда-выражения?


person Jeff Hornby    schedule 26.10.2015    source источник


Ответы (1)


Существует MultiTestConsumer, который можно использовать для получения и отслеживания сообщений, созданных во время тестирования. Вы можете увидеть класс здесь:

https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit/Testing/MultiTestConsumer.cs

И вы можете увидеть, как это используется здесь:

https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.Tests/MultiTestConsumer_Specs.cs

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

Я бы порекомендовал проверить TestFramework, так как там есть множество помощников по асинхронному тестированию.

person Chris Patterson    schedule 26.10.2015
comment
Совместима ли конструкция MultiTestConsumer с RabbitMQ? Я скачал исходный код и запустил тесты. Они были в порядке, когда я запускал их как есть, но когда я изменил базовый класс Using_the_multi_test_consumer на RabbitMqTestFixture, все тесты не прошли. Это задумано? - person Jeff Hornby; 26.10.2015
comment
Чтобы использовать его с RabbitMQ, если вы пытаетесь получать сообщения публикации, вам необходимо подключить его к ReceiveEndpoint (с помощью метода .Configure ()), чтобы были созданы привязки обмена. - person Chris Patterson; 27.10.2015