【发布时间】:2019-10-10 01:23:25
【问题描述】:
我想测试一个使用queueClient.RegisterMessageHandler(MyCallBack, messageHandlerOptions) 向 QueueClient 注册的消息处理程序回调。
public Task MyCallBack(Message msg, CancellationToken token)
{
// Read msg. Do something
// Since everything ran fine, complete the msg.
await _client.CompleteAsync(msg.SystemProperties.LockToken);
}
现在,作为单元测试的一部分,我调用MyCallBack。因为我传递了一个 有效 消息。我希望client.CompleteAsync() 被调用。但是测试会抛出异常。
System.InvalidOperationException: Operation is not valid due to the current state of the object.
这是因为msg.SystemProperties.LockToken没有设置(这是因为消息实际上不是由具有ReceiveMode.PeekLock模式的客户端从队列中读取的)。
有没有办法设置/模拟这个,以便我可以使用虚拟字符串作为令牌运行我的测试?
PS:我知道我可以在实际访问 LockToken 字段之前检查msg.SystemProperties.IsLockTokenSet;但即使在那种情况下,如果_client.CompleteAsync() 被调用,我也永远无法进行单元测试。
【问题讨论】:
-
我尝试在
Message周围放置一个包装器,但这需要在SystemPropertiesCollection周围放置一个包装器。看起来很难模仿。也许您可以将“做某事”提取到另一个依赖项中,并将消息或其正文(至少您可以通过传递)传递给它。这样你就可以测试那个类,而这个方法实际上并没有做任何值得测试的事情。
标签: c# azureservicebus azure-servicebus-queues