无法模拟CloudStorageAccount.CreateCloudBlobClient()

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

我有一个返回 BlobResultSegment 的方法。我必须为该方法编写单元测试用例。任何人都可以建议任何方式来模拟 CloudStorageAccount.CreateCloudBlobClient()

private async Task<BlobResultSegment> GetBlobResultSegment(string containerName, string prefix)
{
    **CloudBlobClient cloudBlobClient = CloudStorageAccount.Parse(_blobDataConnectionString)
                                                                .CreateCloudBlobClient();**

    var cc = cloudBlobClient.GetContainerReference(containerName);
    BlobResultSegment allBlobs = await cc.ListBlobsSegmentedAsync(prefix, default);
    return allBlobs;
}
c# xunit
1个回答
0
投票

你的

GetBlobResultSegment
是一个私有方法,这表明你不应该测试它,否则,它应该是
protected
public

但是,如果你确实需要测试这个方法,让我们考虑一下我们应该关注哪些方面:

您的方法调用外部库来获取

BlobResultSegment
并将其返回给调用者。再次强调,您不应该测试库的内部实现细节。

您的方法的断言是:我调用外部库来获取

BlobResultSegment
,并且我将收到外部库返回给我的任何内容。

因为我不关心库如何获得

BlobResultSegment
,另外,这将是可能的,但很乏味,并且没有提供创建
CloudBlobClient
CloudBlobContainer
的模拟的价值,我将提取每个库调用到虚拟方法:

public class BlobClientClass // Assuming this is the SUT that containning GetBlobResultSegment
{
    public async Task<BlobResultSegment> GetBlobResultSegment(string containerName, string prefix)
    {
        return await GetBlobResultSegmentInternal(containerName, prefix);
    }

    protected virtual async Task<BlobResultSegment> GetBlobResultSegmentInternal(string containerName, string prefix)
    {
        CloudBlobClient cloudBlobClient = CloudStorageAccount.Parse("")
        .CreateCloudBlobClient();

        var cc = cloudBlobClient.GetContainerReference(containerName);
        BlobResultSegment allBlobs = await cc.ListBlobsSegmentedAsync(prefix, default);

        return allBlobs;
    }
}

然后在我的测试中,我将创建一个 Test double 来覆盖对外部库的调用的实现并返回我想要的测试内容。

internal class TestableBlobClientClass : BlobClientClass
{
    private readonly BlobResultSegment blobResultSegment;

    public TestableBlobClientClass(BlobResultSegment blobResultSegment)
    {
        this.blobResultSegment = blobResultSegment;
    }
    protected override Task<BlobResultSegment> GetBlobResultSegmentInternal(string containerName, string prefix)
    {
        return Task.FromResult(blobResultSegment); 
    }
}

最后,我的测试将证实我们上面讨论的内容:

public class UnitTests2
{
    [Fact]
    public async Task Test1Async()
    {
        // Arrange

        var fakeResult = new BlobResultSegment(new List<CloudBlob>(), new BlobContinuationToken());

        var sut = new TestableBlobClientClass(fakeResult);

        // Act
        var result = await sut.GetBlobResultSegment("anyContainerName", "prefix");

        // Assert
        Assert.Equal(fakeResult, result);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.