2015-10-26 93 views
2

我正在嘗試圍繞使用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收到消息,而不連接最多消費類或拉姆達?

回答

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()方法),以便創建交換綁定。 –