如何模拟Azure blobContainerClient.GetBlobsAsync()



我有一个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: BlobService{
private readonly 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;
}

我想到这个问题是因为我也有同样的问题。

基于本文

AsyncPageable<T>Pageable<T>是表示服务在页面中返回的模型集合的类。

方法GetBlobsAsync返回一个asyncpagable。

要创建一个asyncpagable,首先需要创建一个BlobItem Page。

创建Page<T>实例,使用Page<T>.FromValues方法,传递项列表、延续令牌和响应。

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

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

注意:BlobItem有一个内部构造函数,但我发现在这个答案中有一个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);

我希望这能帮助别人解决这个问题。

安德烈

最新更新