我的代码如下:

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

GetResourceGroups()返回ResourceGroupCollection的实例.当ResourceGroupCollectionSingleOrDefault枚举时,我试图让模拟返回ResourceGroupResource的模拟实例.然而,我不确定该怎么做.

到目前为止,我的Moq测试中有以下代码:

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中,以便在枚举后者时返回它.

推荐答案

不幸的是,你不能正确地模拟ResourceGroupData,因为ResourceData‘S Name(1,2)没有定义为virtual/abstract

//Arrange
const string resourceGroupName = "A";

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

// The above commented mock setup would throw NotSupportedException

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)); 

// The above commented line would throw NullReferenceException

//Assert
Assert.NotNull(actual);

因此,如果您不在谓词中使用Name属性(如上面的示例),那么您可以模拟/伪造其余的类.

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

如何使用Automapper映射两个嵌套列表

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

并行令牌更新

我需要两个属性类吗

如何注销Microsoft帐户?

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

SortedSet.Remove()不会删除SortedSet.Min返回的元素

异步实体框架核心查询引发InvalidOperation异常

BlockingCollection T引发意外InvalidOperationException

使用带有参数和曲面的注入失败(&Q;)

如何使用.NET6WPF打印车票?

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

并发表更新.EF核心交易

如何保存具有多个重叠图片框的图片框?

客户端/服务器RPC如何处理全局变量?

如何根据分割文本的块数来计算文本的大小?

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?