gpt4 book ai didi

C# Moq 如何设置 EF DbContext 扩展方法 ToList() 以返回 mock.Object.Tolist()

转载 作者:行者123 更新时间:2023-12-04 15:55:56 25 4
gpt4 key购买 nike

我正在尝试使用 Moq 模拟 Entity Framework DbContext,尤其是它的扩展方法 Add()、Tolist() 和 Find()。

我需要 Find() 和 ToList() 方法来实际返回存储在我的 mockContext.Object 中的值 .

我已经创建了我的 DbSet 并设置了以下属性:

var mockTickets = new Mock<DbSet<Ticket>>();

mockTickets.As<IQueryable<Ticket>>().Setup(m => m.Provider).Returns(tickets.Provider);
mockTickets.As<IQueryable<Ticket>>().Setup(m => m.Expression).Returns(tickets.Expression);
mockTickets.As<IQueryable<Ticket>>().Setup(m => m.ElementType).Returns(tickets.ElementType);
mockTickets.As<IQueryable<Ticket>>().Setup(m => m.GetEnumerator()).Returns(() => tickets.GetEnumerator());

我已经使用以下属性创建了我的 DbContext

var mockContext = new Mock<SupportCenterDbContext>();
mockContext.Setup(m => m.Tickets).Returns(mockTickets.Object);

现在我正在尝试测试以下方法

  • mockContext.Object.Tickets.Add(Ticket ticket)
    返回票 t
  • mockContext.Object.Tickets.ToList<Ticket>()
    返回 IEnumerable 门票
  • mockContext.Object.Tickets.Find(int ticketNumber)
    返回票 t

我尝试了以下代码,但得到“扩展方法上的设置无效”。

mockContext.Setup(x => x.Tickets.Add(It.IsAny<Ticket>())).Returns(It.IsAny<Ticket>());
mockContext.Setup(x => x.Tickets.ToList()).Returns(mockTickets.Object.ToList());
mockContext.Setup(x => x.Tickets.Find(It.IsAny<int>())).Returns(It.IsAny<Ticket>());

这些是我对 Add() 的断言和 ToList()方法

//ToList
Assert.AreEqual(result.Count(), mockContext.Object.Tickets.Count());
Assert.IsInstanceOfType(result, typeof(IEnumerable<Ticket>));

//Add
Assert.IsInstanceOfType(result, typeof(Ticket));
mockContext.Verify(x => x.Tickets.Add(It.IsAny<Ticket>()), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Once());

编辑
通过删除 mockContext.Setup(x => x.Tickets.ToList()).Returns(mockTickets.Object.ToList());,我更近了一步.

并添加以下内容

  • mockContext.Setup(x => x.Tickets.Add(It.IsAny<Ticket>())).Returns<Ticket>(x => x);
  • mockContext.Setup(t => t.Tickets.Find(It.IsAny<int>())).Returns<int>(x => mockContext.Object.Tickets.Find(x));

最后一行仍然没有产生所需的输出。是不是不能把输入参数的值传递给Find() Returns() 中的方法部分?

在此先感谢您的帮助。

最佳答案

您不能模拟扩展方法,模拟 DBContext 也不是常见的做法。

更好的想法是使用内存中的数据上下文并用测试数据填充它,如下所述:https://learn.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory

关于C# Moq 如何设置 EF DbContext 扩展方法 ToList() 以返回 mock.Object.Tolist(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51668187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com