NSubstitute 或 moq ListBlobsSegmentedAsync 及其 ContinuationToken
NSubstitute or moq ListBlobsSegmentedAsync and its ContinuationToken
我正在尝试为以下方法创建单元测试用例。我试图模拟容器 ListBlobsSegmentedAsync 但 response.ContinuationToken 变得空了。所以代码在两者之间崩溃。你们能否建议如何为以下方法编写单元测试。
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)
尝试更新测试以消除与代码相同的重载,如果它仍然无法按预期工作,请告诉我。
我正在尝试为以下方法创建单元测试用例。我试图模拟容器 ListBlobsSegmentedAsync 但 response.ContinuationToken 变得空了。所以代码在两者之间崩溃。你们能否建议如何为以下方法编写单元测试。
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)
尝试更新测试以消除与代码相同的重载,如果它仍然无法按预期工作,请告诉我。