我正在尝试对以下方法进行单元测试
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);
}
如果
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);
无论如何,这就是总体想法。