如何伪造/单元测试 Azure 存储队列?

Posted

技术标签:

【中文标题】如何伪造/单元测试 Azure 存储队列?【英文标题】:how to fake / unit test Azure Storage Queue? 【发布时间】:2021-07-08 15:07:53 【问题描述】:

我正在尝试找到一种方法来测试我拥有的一些将查询天蓝色存储队列的代码。目前,我被要求创建自己的本地内存队列类来模拟上游 Azure 队列。 此时,我正在尝试查看是否可以在假队列中创建示例消息,以便我的类的被调用者有一些数据可以使用。

所以我正在尝试做这样的事情:

using Azure.Storage.Queues.Models;
namespace Widgets.Tests.Queues

    public class InMemoryAzureMessageQueue : IAzureQueueClient
    
        public string DequeueMessage(QueueMessage message)
        
            throw new System.NotImplementedException();
        

        public QueueMessage[] GetMessages()
        
           //pseudocode
           QueueMessage qm = new QueueMessage();
           QueueMessage[] listqm = new QueueMessage[];
           qm.messageID = xxx;
           qm.messageBody = "hello";

           listqm.add(qm);
           return listqm;

        

        public bool HasMesssages()
        
            return true; 
        
    
 

当我尝试创建“qm”时,我收到以下错误消息: 'QueueMessage' 不包含采用 0 个参数的构造函数

到目前为止我所做的尝试:

我在单击 QueueMessage 时尝试“转到定义”,只是为了查看构造函数的外观。但是当我这样做时,我收到一条错误消息,提示找不到定义。

类的描述是这样的:

The object returned in the QueueMessageList array when calling Get Messages on a Queue.

也许我不能只创建这样的消息?

我对 .NET 和 Azure 的一切都很熟悉。 任何提示将不胜感激。

【问题讨论】:

你读过任何文档/谷歌搜索过该错误吗?这是一个非常微不足道的错误要解决。这基本上意味着您需要将所需的参数传递给 QueueMessage 的构造函数。你在使用像 Visual Studio 这样的 IDE 吗?如果您在QueueMessage 上使用ctrl + click,IDE 可能会将您带到类型的定义,您可以在其中看到构造函数及其所需的参数。您也可以只用 google QueueMessage 并在文档中查看所需的参数。 是的,实际上我已经尝试“转到定义”,但它显示没有为 QueueMessage 找到定义。我已经确认在我的代码顶部添加了正确的库...我将更新我的问题以包含这些详细信息。 您可能需要插件来定义您自己项目之外的代码。在谷歌搜索 QueueMessage 之后,我发现了这个页面,它向您展示了如何模拟创建队列消息:docs.microsoft.com/en-us/dotnet/api/… 【参考方案1】:

QueueMessage 类不包含可访问的构造函数。但是,您可以使用 QueuesModelFactory 构建消息,它是为模拟这些消息而设计的:

public QueueMessage[] GetMessages()

    QueueMessage qm = QueuesModelFactory.QueueMessage(
        messageId: "xxx",
        popReceipt: "",
        messageText: "hello",
        dequeueCount: 0);
    QueueMessage[] listqm = new QueueMessage[1];

    listqm[0] = qm;
    return listqm;

【讨论】:

应该是:QueueMessage[] listqm = new QueueMessage[1];

以上是关于如何伪造/单元测试 Azure 存储队列?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpRequestMessage 对 Azure Functions 进行单元测试

如何让 VSTS 使用 net Net Standard Azure Functions 找到我的 NetCore 单元测试?

单元测试之Mock(Moq)

在 Azure DevOps 测试结果中查看单元测试说明

go单元测试进阶篇

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