azure - 如何模拟 Azure blobContainerClient.GetBlobsAsync()

标签 azure unit-testing azure-storage xunit

我有一个 Azure blob 容器,我正在使用以下代码访问它 -

       var blobContainerClient = GetBlobContainer(containerName);
            if (blobContainerClient != null)
            {
                // List all blobs in the container
                await foreach (BlobItem blobItem in blobContainerClient.GetBlobsAsync())
                {
                    queuedBlobsList.Add(new QueuedBlobs { BlobName = blobItem.Name, LastModified = blobItem.Properties.LastModified });
                }
            }

    private BlobContainerClient GetBlobContainer(string containerName)
    {
        return gen2StorageClient != null
            ? gen2StorageClient.GetBlobContainerClient(containerName)
            : gen1StorageClient.GetBlobContainerClient(containerName);
    }

客户端在构造函数中初始化 - 公共(public)类 BlobService :IBlobService {
私有(private)只读 BlobServiceClient gen1StorageClient,gen2StorageClient;

   public BlobService(BlobServiceClient defaultClient, IAzureClientFactory<BlobServiceClient> clientFactory)
        {
              gen1StorageClient = defaultClient;
              if (clientFactory != null)
              {
               gen2StorageClient = clientFactory.CreateClient("StorageConnectionString");
              }
       }
    }

我设置 GetBlobsAsync 的单元测试是这样的 - 但我想添加 BlobItems 列表来测试另一个循环。

    private static Mock<BlobContainerClient> GetBlobContainerClientMockWithListOfBlobs()
    {
        var blobContainerClientMock = new Mock<BlobContainerClient>("UseDevelopmentStorage=true", EnvironmentConstants.ParallelUploadContainer);
        var cancellationToken = new CancellationToken();
        var blobs = new List<BlobItem>();

        //AsyncPageable<BlobItem> blobItems = new AsyncPageable<BlobItem>(); -- Not allowing
        blobContainerClientMock.Setup(x => x.GetBlobsAsync(BlobTraits.All, BlobStates.All, null, cancellationToken)).Returns(It.IsAny<AsyncPageable<BlobItem>>());
        return blobContainerClientMock;
    }

最佳答案

我提出这个问题是因为我也遇到了同样的问题。

基于此article

AsyncPageable<T> and Pageable<T> are classes that represent collections of models returned by the service in pages.

方法 GetBlobsAsync 返回 AsyncPageable。

要创建 AsyncPageable,您首先需要创建 BlobItem 页面。

创建 Page<T>例如,使用Page<T>.FromValues方法,传递项目列表、延续标记和响应。

让我们开始创建项目列表:

var blobList = new BlobItem[]
{
    BlobsModelFactory.BlobItem("Blob1"),
    BlobsModelFactory.BlobItem("Blob2"),
    BlobsModelFactory.BlobItem("Blob3")
};

注意:BlobItem 有一个内部构造函数,但我在这个 answer 中找到了有一个 BlobsModelFactory。

有了 Blob 列表后,就可以创建 Page<BlobItem> 了。 :

Page<BlobItem> page = Page<BlobItem>.FromValues(blobList, null, Mock.Of<Response>());

最后,创建 AsyncPageable<BlobItem>

AsyncPageable<BlobItem> pageableBlobList = AsyncPageable<BlobItem>.FromPages(new[] { page });

现在您可以使用它来模拟 GetBlobsAsync 方法:

blobContainerClientMock
    .Setup(m => m.GetBlobsAsync(
        It.IsAny<BlobTraits>(),
        It.IsAny<BlobStates>(),
        It.IsAny<string>(),
        It.IsAny<CancellationToken>()))
    .Returns(pageableBlobList);

我希望这可以帮助其他人解决这个问题。

安德烈

关于azure - 如何模拟 Azure blobContainerClient.GetBlobsAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72518199/

相关文章:

ios - Azure、AWS、同步服务、数据库和 iOS

java - 使用 Jersey 框架进行测试,并使用 Extentreports 进行报告

unit-testing - 为什么 chefspec 找不到 chef_handler Recipe ?

unit-testing - karma-runner 有更好的用户界面吗?

azure - 如何公开 Azure 镜像?

Azure 表查询

Azure 应用服务 - MVC5 WebApp 缺少 css 文件

作为 Google PubSub 推送订阅者的 Azure 服务总线主题

linux - 需要将 azure VM OS 磁盘大小从 32 GB 调整为 16 GB

asp.net - web.config 重写规则在 Blob 存储中的 Azure 静态网站中不起作用