MassTransit - InMemoryTestHarness 和优先消息传递

MassTransit - InMemoryTestHarness and Priority Messaging

我们决定在我们的一个队列上启用优先级排队。它的实现很简单,代码更改也很小,所以我们对这个功能非常满意。

我遇到的问题是关于消费者的单元测试。我们使用 Mass Transits InMemoryTestHarness。 当它命中 SetPriority 方法时抛出一个 System.ArgumentException 'The RabbitMqSendContext was not available'.

await context.Publish(message, c => { 
    c.RequestId = requestId; 
    c.SetPriority(priority); //throws exception here
});

当我们开始对另一个队列使用直接交换时,我们遇到了同样的问题,但我们能够使用 RoutingKeyConventionExtensions 中的 UseRoutingKeyFormatter 方法将其配置移动到代码中,进入总线配置。

是否有类似的优先队列? 或者有什么方法可以保留此代码并仍然使用 InMemeroryTestHarness?

优先级队列是 RabbitMQ 的一个特性,它们不是由内存传输实现的。因此测试将无法访问代理特定的功能。

如果您查看 SetPriority 调用,它正在调用 GetPayload,如果负载类型不存在,它会抛出异常。如果可用,您可以更改您的逻辑以尝试设置它。

if(c.TryGetPayload<RabbitMqSendContext>(out var rc))
    rc.BasicProperties.Priority = priority;

这样它就不会在测试中出错,但会按预期使用 RabbitMQ。