我的代码如下:
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
,以便在枚举后者时返回它。
TL;DR:不幸的是,你无法正确模拟
ResourceGroupData
,因为ResourceData
的Name
(1,2)没有定义为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
属性(如上面的示例所示),那么您可以模拟/伪造其余的类。