如何对调用服务总线队列客户端SendAsync方法的类进行单元测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对调用服务总线队列客户端SendAsync方法的类进行单元测试相关的知识,希望对你有一定的参考价值。

我有一个接口,它有一个方法来创建队列客户端和消息工厂的实例。我已经创建了相同的具体实现,现在我正在尝试单元测试用于将消息发送到队列的功能。我在下面写了相同的代码:

private readonly Mock<IQueueClientProvider> queueClientProvider;

private readonly Mock<IJsonSerializer> jsonSerializer;

private readonly Mock<ILogger<QueueConnector>> logger;

private readonly ModelLogger<QueueConnector> modelLogger;

private readonly QueueConnector queueConnector;

private readonly Mock<QueueClient> queueClient;

public QueueConnectorTests() 

{

   queueClientProvider = new Mock< IQueueClientProvider >();

   queueClient = new Mock< QueueClient >();

   logger = new Mock< ILogger< QueueConnector >>();

   jsonSerializer = new Mock< IJsonSerializer >();

   modelLogger = new ModelLogger<QueueConnector>(logger.Object,     jsonSerializer.Object);

queueConnector = new QueueConnector(modelLogger, queueClientProvider.Object);

}

[Fact]
public async void ShouldBeAbleToSendMessage()

{

  BrokeredMessage brokeredMessage = new BrokeredMessage();

brokeredMessage.CorrelationId = "0HKVUFCD6Q5JL";

queueClientProvider.Setup(q =>q.CreateQueueClient()).Returns(queueClient.Object);

// Act

await queueConnector.SendMessage(brokeredMessage);

// Assert

 queueClient.Verify(q => q.SendAsync(brokeredMessage));


}

但得到例外

mscorlib.dll中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理

附加信息:Parent没有默认构造函数。必须显式定义默认构造函数。

有人可以帮我这个不确定这里出错了吗?

答案

您应该在代码中使用IQueueClient接口而不是QueueClient实现。 SendAsync方法是ISenderClient继承的IQueueClient接口的一部分。

一旦你使用了IQueueClient,你可以这样做:

var queueClientMock = new Mock<IQueueClient>();
queueClientMock.Setup(x => 
x.SendAsync(It.IsAny<Message>))).Returns(Task.CompletedTask).Verifiable();

以上是关于如何对调用服务总线队列客户端SendAsync方法的类进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

使用azure服务总线,如何将单个消息发布到多个队列?

Azure 服务总线队列消息处理

在不同的 Azure 服务总线队列中使用相同的消息 ID 会导致错误

我如何拥有一个写入服务总线队列的异步函数?

如何从 Httpclient.SendAsync 调用中获取和打印响应

Azure 服务总线 - 留言