NSubstitute或moq ListBlobsSegmentedAsync及其ContinuationToken

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

我正在尝试为以下方法创建单元测试用例。我尝试模拟容器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。因此,请提出我应该如何模拟这种方法。预先感谢!

.net .net-core nunit azure-storage
1个回答
0
投票

似乎代码正在调用:

ListBlobsSegmentedAsync(BlobContinuationToken)

但是测试是嘲笑的:

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

尝试更新测试以消除与代码相同的重载,请让我知道它是否仍然无法按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.