如何在测试过程中检测内存总线何时完成了对所有消息的处理?

时间:2019-04-12 18:12:11

标签: masstransit

我正在努力寻找一种用于MassTransit内存总线的API,该API可以使我的测试知道所有消息已被其匹配的使用者消耗。

如果我的总线配置如下:

_bus = Bus.Factory.CreateUsingInMemory(cfg =>
{
    cfg.ReceiveEndpoint("server.fax.inbound.received", ep =>
    {
        InboundFaxReceivedConsumer.UseMessageRetry(ep);
        ep.Consumer(() => new InboundFaxReceivedConsumer(
            _db.Create(),
            new NullLogger<InboundFaxReceivedConsumer>()));
    });
});

然后,我希望能够执行以下操作:

_bus.Start();
_controller.Post(xml); // controller post is gonna publish a message
_bus.WaitForInactivity(); // <-- this is what I don't know how to do
_bus.Stop();

1 个答案:

答案 0 :(得分:0)

如果要测试消息是否已被实际使用,则应使用InMemoryTestHarness,它具有用于观察者使用方并确保消息已被使用的方法。在测试断言通过(或者说失败)之后,您可以停止测试工具。

单元测试中有一个示例消费者测试: https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.Tests/Testing/ConsumerTest_Specs.cs

在您的情况下,您将为消费者设置安全带:

var harness = new InMemoryTestHarness();
var consumer = _harness.Consumer<InboundFaxReceivedConsumer>();

然后,一旦调用了控制器Post方法,您将等待使用者接收并处理消息:

Assert.That(consumer.Consumed.Select<InboundFaxReceived>().Any(), Is.True);