gpt4 book ai didi

c# - 单元测试 ServiceBus.Message。如何为 SystemProperties.LockToken 设置值?

转载 作者:行者123 更新时间:2023-11-30 16:38:00 25 4
gpt4 key购买 nike

我想使用 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() 被调用,我也永远无法进行单元测试。

最佳答案

以下是如何创建用于测试的消息并设置 LockToken:

var message = new Message();
var systemProperties = message.SystemProperties;
var type = systemProperties.GetType();
var lockToken = Guid.NewGuid();
type.GetMethod("set_LockTokenGuid", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(systemProperties, new object[] { lockToken });
type.GetMethod("set_SequenceNumber", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(systemProperties, new object[] { 0 });

我希望我能够想出一些不涉及反射(reflection)的东西。

关于c# - 单元测试 ServiceBus.Message。如何为 SystemProperties.LockToken 设置值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56275725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com