我正在尝试为以下方法创建单元测试用例。我尝试模拟容器ListBlobsSegmentedAsync,但是response.ContinuationToken变为null。因此,代码在两者之间崩溃。你们可以建议如何为以下方法编写单元测试。
public List<IListBlobItem> GetListBlobsAsync(CloudBlobContainer container)
{
BlobContinuationToken continuationToken = null;
var results = new List<IListBlobItem>();
do
{
var response = container.ListBlobsSegmentedAsync(continuationToken).Result;
continuationToken = response.ContinuationToken;
results.AddRange(response.Results);
}
while (continuationToken != null);
return results;
}
我尝试如下编写单元测试。
[TestMethod]
public void GetListBlobsAsync_Test()
{
// Arrange
var items = new List<IListBlobItem>();
items.Add(new CloudBlockBlob(new Uri("http://bogus/myaccount/blob/myfiles/test1.txt")));
items.Add(new CloudBlockBlob(new Uri("http://bogus/myaccount/blob/myfiles/test2.txt")));
items.Add(new CloudBlockBlob(new Uri("http://bogus/myaccount/blob/myfiles/test3.txt")));
var client = Substitute.For<CloudBlobClient>(new Uri("http://foo.bar/"), null);
var continuationToken = new BlobContinuationToken() { NextMarker = "abc123" };
var container = Substitute.For<CloudBlobContainer>(new Uri("http://foo.bar/"));
client.GetContainerReference(Arg.Any<string>()).Returns(container);
container.ListBlobsSegmentedAsync(Arg.Any<string>(), Arg.Any<bool>(),
Arg.Any<BlobListingDetails>(),
Arg.Any<int?>(),
Arg.Any<BlobContinuationToken>(),
Arg.Any<BlobRequestOptions>(),
Arg.Any<OperationContext>(),
Arg.Any<CancellationToken>())
.Returns(ci => new BlobResultSegment(items.ToArray(), continuationToken));
// Act
var readDeleteOperations = new ReadDeleteOperations();
var result = readDeleteOperations.GetListBlobsAsync(container);
// Assert
result.Count.Should().Be(items.Count);
}
但是ListBlobsSegmentedAsync方法未正确模拟并返回null。因此,请提出我应该如何模拟这种方法。预先感谢!
似乎代码正在调用:
ListBlobsSegmentedAsync(BlobContinuationToken)
但是测试是嘲笑的:
ListBlobsSegmentedAsync(String, Boolean, BlobListingDetails, Nullable<Int32>,
BlobContinuationToken, BlobRequestOptions, OperationContext, CancellationToken)
尝试更新测试以消除与代码相同的重载,请让我知道它是否仍然无法按预期工作。