首页 > 解决方案 > NSubstitute 或 moq ListBlobsSegmentedAsync 及其 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。所以请建议我应该如何模拟这种方法。提前致谢!!

标签: .net.net-corenunitazure-storage

解决方案


看起来代码正在调用:

ListBlobsSegmentedAsync(BlobContinuationToken)

但测试是嘲笑:

ListBlobsSegmentedAsync(String, Boolean, BlobListingDetails, Nullable<Int32>,
    BlobContinuationToken, BlobRequestOptions, OperationContext, CancellationToken)

尝试更新测试以消除与代码相同的重载,如果它仍然无法按预期工作,请告诉我。


推荐阅读