如何正确模拟IAzureClientFactory<BlobServiceClient>

问题描述 投票:0回答:1

我有一个类,其构造函数中以

IAzureClientFactory<BlobServiceClient>
作为参数,如下:

public class BlobStorageService
{
    readonly BlobServiceClient client;
    public BlobStorageService(IAzureClientFactory<BlobServiceClient> factory)
    {
        client = factory.CreateClient("AZGO")
    }
    
    ...other method to download, upload and delete files
}

我想为该类创建实例。在 blob 存储中下载文件时使用此方法失败。

var blobServiceClient = new Mock<BlobServiceClient>("DefaultEndpointsProtocol=https;AccountName=xxx");
var factory = new Mock<IAzureClientFactory<BlobServiceClient>>();
factory.Setup(c => c.CreateClient("AZGO").Returns(blobServiceClient.Object);

var service = new Mock<BlobStorageService>(factory.Object);
var instance = service.Object;

当我在控制器中使用它时,我可以获得 BlobStorageService 的实例,并且可以毫无错误地下载文件。我用以下方法注册DI:

services.AddAzureClients(builder =>
{
    builder.AddBlobServiceClient(connectionString).WithName("AZGO");
});
services.AddScoped<BlobStorageService>();
c# moq xunit
1个回答
1
投票

回复晚了,但我确信其他人仍在遇到这个挑战。 我的团队解决了这个问题,但要注意,正如评论中所说,模拟这个 blob 层意味着您将不得不模拟很多不同的层......:

// Arrange
var mockBlobItem1 = new Mock<BlobItem>(); // You might want these blobs to also contain something, but just for the example
var mockBlobItem2 = new Mock<BlobItem>();
var mockBlobItem3 = new Mock<BlobItem>();

var page1 = Page<BlobItem>.FromValues(new[] { mockBlobItem1.Object, mockBlobItem2.Object }, "continuationToken", Mock.Of<Response>());
var lastPage = Page<BlobItem>.FromValues(new[] { mockBlobItem3.Object }, continuationToken: null, Mock.Of<Response>());

var asyncPageable = AsyncPageable<BlobItem>.FromPages(new[] { page1, lastPage });

var mockBlobContainerClient = new Mock<BlobContainerClient>();
mockBlobContainerClient.Setup(m => m.GetBlobsAsync(default, default, default, default)).Returns(asyncPageable);

var mockBlobServiceClient = new Mock<BlobServiceClient>();
mockBlobServiceClient.Setup(m => m.GetBlobContainerClient("blobContainerName")).Returns(mockBlobContainerClient.Object);

var blobService = new BlobService(mockBlobServiceClient.Object); // Test implementation with dependencies

var expected = new List<BlobItem>() { mockBlobItem1.Object, mockBlobItem2.Object, mockBlobItem3.Object };

// Act
var actual = await blobService.GetBlobsFromContainer("blobContainerName");

// Assert things here

在 Act 中,我们只是调用一个组合不同页面结果的方法,这正是我们应用程序中想要的。

然后你可以让模拟工厂返回blobservice。然后将其注入到您的服务中:)

© www.soinside.com 2019 - 2024. All rights reserved.