如何使用 Moq 模拟 ResourceGroupCollection?

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

我的代码如下:

SubscriptionResource subscription = await armClient.GetDefaultSubscriptionAsync();
var resourceGroup = subscription.GetResourceGroups().FirstOrDefault(rg => rg.Data.Name.Equals(resourceGroupName));

GetResourceGroups()
返回
ResourceGroupCollection
的实例。当
ResourceGroupCollection
SingleOrDefault
枚举时,我试图让模拟返回
ResourceGroupResource
的模拟实例。但是,我不知道该怎么做。

到目前为止,我的起订量测试中有此代码:

this.resourceGroupCollectionMock = new Mock<ResourceGroupCollection>() { CallBase = true };

Mock<ResourceGroupResource> adfResource = new Mock<ResourceGroupResource>();
ResourceGroupData rgData = ResourceManagerModelFactory.ResourceGroupData(resourceIdentifier, resourceGroupName);
adfResource.Setup(x => x.Data).Returns(rgData);

this.subscriptionResourceMock.Setup(x => x.GetResourceGroups()).Returns(this.resourceGroupCollectionMock.Object);

正如您在我的设置中看到的,我模拟了

GetResourceGroups()
以返回模拟
ResourceGroupCollection
对象。但我不确定如何将
adfResource
添加到该模拟
resourceGroupCollectionMock
,以便在枚举后者时返回它。

c# unit-testing moq resource-management
1个回答
0
投票

TL;DR:不幸的是,你无法正确模拟

ResourceGroupData
,因为
ResourceData
Name
12)没有定义为
virtual
/
abstract
;(

//Arrange
const string resourceGroupName = "A";

Mock<ResourceGroupData> data = new();
// data
//     .SetupGet(x => x.Name)
//     .Returns(resourceGroupName);

Mock<ResourceGroupResource> resource = new();
resource
    .SetupGet(x => x.Data)
    .Returns(data.Object);

Mock<Response> response = new();
var pagedResource =  Page<ResourceGroupResource>.FromValues(new ResourceGroupResource[] { resource.Object }, null, response.Object);
var pagedResources = Pageable<ResourceGroupResource>.FromPages(new Page<ResourceGroupResource>[] { pagedResource });

Mock<ResourceGroupCollection> collection = new();
collection
    .Setup(x => x.GetAll(It.IsAny<string>(), It.IsAny<int?>(), It.IsAny<CancellationToken>()))
    .Returns(pagedResources);

Mock<SubscriptionResource> subscription = new();    
subscription
    .Setup(x => x.GetResourceGroups())
    .Returns(collection.Object);

//Act
var actual = subscription.Object.GetResourceGroups()
    .FirstOrDefault();
    //.FirstOrDefault(rg => rg.Data.Name.Equals(resourceGroupName));

//Assert
Assert.NotNull(actual);

因此,如果您不在谓词中使用

Name
属性(如上面的示例所示),那么您可以模拟/伪造其余的类。

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