2015-10-26 94 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()方法),以便创建交换绑定。 –