2015-10-26 2 views
2

Я пытаюсь создать тесты интеграции черного ящика вокруг некоторых сервисов, которые я создал с помощью MassTransit. Суть службы заключается в том, что она получает сообщение на канале MassTransit, обрабатывает сообщение и отправляет сообщение на другом канале MassTransit (обратите внимание, что это не семантика Request-Reply, а больше компонента в конвейере):Интеграция тестирования микросервисов с использованием 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 без разводки класса потребителей или лямбды?

ответ

3

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

http://source.masstransit-project.com/#MassTransit/Testing/MultiTestConsumer.cs,38b5f13551e86891

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

http://source.masstransit-project.com/#MassTransit.Tests/MultiTestConsumer_Specs.cs,cf839cb90ee7dce1

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

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

+0

Является ли дизайн MultiTestConsumer для работы с RabbitMQ? Я загрузил исходный код и выполнил тесты. Они были прекрасны, когда я запускал их, как есть, но когда я изменил базовый класс Using_the_multi_test_consumer на RabbitMqTestFixture, все тесты не удались. Это по дизайну? –

+0

Чтобы использовать его с помощью RabbitMQ, если вы пытаетесь получать сообщения, вы должны подключить их к ReceiveEndpoint (используя метод .Configure()), чтобы были созданы привязки обмена. –

Смежные вопросы