我有一个返回 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;
}
你的
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);
}
}