【发布时间】:2017-04-26 17:30:40
【问题描述】:
我创建了一个 BrokeredMessage 实例,并希望围绕它的传递计数与队列的最大传递计数来测试我的代码。我不想建立一个真正的队列来发送和接收消息,但是在传递消息之前不会初始化 deliverycount 属性。我怎么能伪造这个?
【问题讨论】:
标签: azure-servicebus-queues brokeredmessage
我创建了一个 BrokeredMessage 实例,并希望围绕它的传递计数与队列的最大传递计数来测试我的代码。我不想建立一个真正的队列来发送和接收消息,但是在传递消息之前不会初始化 deliverycount 属性。我怎么能伪造这个?
【问题讨论】:
标签: azure-servicebus-queues brokeredmessage
我设法模拟了这一点,并让它为完整和放弃消息创建一个包装器。在没有包装器的情况下进行单元测试时,我在 message.Complete() 上绊倒了。
创建一个类和接口来处理消息操作。
public class MainServiceBusClientWrapper : IServiceBusClientWrapper
{
public void Complete(BrokeredMessage message) => message.Complete();
public void Abandon(BrokeredMessage message) => message.Abandon();
}
在处理传入服务总线消息的类中执行此操作:
private IServiceBusClientWrapper _serviceBusWrapper;
_serviceBusWrapper.Complete(message);
代替:
message.Complete();
在您的单元测试中,您可以执行以下操作以确保 BrokeredMessage 操作不会失败:
_serviceBusWrapper.Setup(p => p.Complete(It.IsAny<BrokeredMessage>()));
我希望这会有所帮助!
【讨论】:
deliverycount 属性在消息被传递之前不会被初始化。我怎么能伪造这个?
BrokeredMessage.DeliveryCount property 是只读的,消息传递后DeliveryCount 的值会增加。没有简单的方法来模拟 BrokeredMessage 类,但 Obvs.AzureServiceBus 集成库似乎提供了一种控制属性以用于特定测试的方法,您可以尝试实现自己的模拟/假 IMessagePropertiesProvider。
更多详细信息,请查看以下链接。
【讨论】:
我最终只编写了一个名为 GetDeliveryCount 的辅助函数,它接受一个代理消息作为参数。这返回了 message.DeliverCount。对于我的单元测试,我只是嘲笑它以返回我想要的任何东西。
【讨论】: