BrokeredMessage Azure ServiceBus 的虚假交付和接收

Fake delivery and receipt of a BrokeredMessage Azure ServiceBus

我已经创建了一个 BrokeredMessage 的实例,并想围绕它的传递计数与队列的最大传递计数来测试我的代码。我不想建立一个真正的队列来发送和接收消息,但是传递计数 属性 在传递消息之前不会初始化。我怎么能伪造这个?

the deliverycount property is not initialized until the message is delivered. How can I fake this?

BrokeredMessage.DeliveryCount property是只读的,DeliveryCount的值会在消息投递后增加。没有简单的方法来模拟 BrokeredMessage class,但是 Obvs.AzureServiceBus 集成库似乎提供了一种方法来控制用于特定测试目的的属性,您可以尝试实现自己的 mock/fake IMessagePropertiesProvider。

更多详细信息,请查看以下链接。

我最后只是编写了一个名为 GetDeliveryCount 的辅助函数,它接受一个代理消息作为参数。这 returned message.DeliverCount。对于我的单元测试,我只是将其嘲笑为 return 任何我想要的。

我设法模拟了这一点,并让它为完成和放弃消息创建了一个包装器。在没有包装器的情况下进行单元测试时,我被 message.Complete() 绊倒了。

创建一个 Class 和接口来处理消息操作。

    public class MainServiceBusClientWrapper : IServiceBusClientWrapper
    {
        public void Complete(BrokeredMessage message) => message.Complete();
        public void Abandon(BrokeredMessage message) => message.Abandon();
    }

在处理传入服务总线消息的 class 中执行此操作:

private IServiceBusClientWrapper _serviceBusWrapper;

_serviceBusWrapper.Complete(message);

而不是:

message.Complete();

在你的单元测试中,你可以做这样的事情来避免 BrokeredMessage 操作失败:

_serviceBusWrapper.Setup(p => p.Complete(It.IsAny<BrokeredMessage>()));

希望对您有所帮助!