使用 Moq 模拟 Google 的 StorageClient ListObjects 方法

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

我正在尝试对以下方法进行单元测试

public List<string> GetFilesInGCS(string bucket, string node)
{
    List<string> fileNames = new List<string>();
    try
    {
        log.Info($"Getting files from {bucket}...");
        foreach (var storageObject in storageClient.ListObjects(bucket, node))
            fileNames.Add(storageObject.Name);

        log.Info($"Total files: {fileNames.Count}");
    }
    catch (Exception ex)
    {
        Task.Run(async () => { await _emailer.SendErrorAsync(ex); });
        log.Error(ex);
    }
    return fileNames;
}

问题是我不知道如何正确模拟

ListObjects
方法的返回。它返回一个抽象类
PageEnumerable<Objects, Object>

这就是我目前所拥有的。

[Test]
public void TestGetFilesInGCS()
{
    Mock<StorageClient> storageClientMock = new Mock<StorageClient>(MockBehavior.Loose);
    storageClientMock.Setup(m => m.ListObjects(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<ListObjectsOptions>()));
    GoogleService g = new GoogleService(storageClientMock.Object);
    var files = g.GetFilesInGCS("test", "test");
    Assert.That(files, Is.Not.Empty);
}
c# .net unit-testing google-cloud-platform moq
1个回答
0
投票

如果

ListObjects
的返回类型是
PageEnumerable<Objects, Object>
,并且这是一个抽象类,您也可以使用 Moq 创建它的实例:

var res = new Mock<PageEnumerable<Objects, Object>>()

然后设置

storageClientMock
返回它:

storageClientMock
    .Setup(m => m.ListObjects(
        It.IsAny<string>(),
        It.IsAny<string>(),
        It.IsAny<ListObjectsOptions>()))
    .Returns(res.Object);

无论如何,这就是总体想法。

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