我正在尝试围绕我使用MassTransit创建的某些服务创建黑盒集成测试。该服务的要旨是它在MassTransit通道上接收消息,处理该消息并在另一个MassTransit通道上发送该消息(请注意,这不是Request-Reply语义,而是管道中的更多组件):

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接收消息而无需连接消费类或lambda?

最佳答案

有一个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,因为那里有很多异步测试助手。

关于c# - 使用MassTransit集成测试微服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33336808/

10-10 23:03