如何模拟Azure blobContainerClient.GetBlobsAsync()

b1uwtaje  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(148)

我有一个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);
    }

客户端在构造函数中初始化-公共类BlobService:IBlob服务{
私有只读BlobServiceClient第一代存储客户端、第二代存储客户端;

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;
    }
c9qzyr3d

c9qzyr3d1#

我提出这个问题是因为我也有同样的问题。
基于此article
AsyncPageable<T>Pageable<T>是表示由页面中的服务返回的模型集合的类。
方法GetBlobsAsync返回一个可异步分页。
要创建一个AsyncPageable,首先需要创建一个BlobItem页面。
要创建Page<T>示例,请使用Page<T>.FromValues方法,传递项列表、连续标记和Response。
因此,让我们开始创建项目列表:

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);

我希望这对其他人在这个问题上有帮助。
安德烈

相关问题