System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的设置无效

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member

我在使用 Moq 进行单元测试时收到 NotSupportedException 错误消息

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member

单元测试代码:

[TestMethod]
public void TestEmailNotSentOut()
{
  // ...

  var dataAccess = new Mock<TjiContext>();       
  var mockSetStock = new Mock<DbSet<Stock>>();
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.Provider).Returns(stockList.Provider);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.Expression).Returns(stockList.Expression);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.ElementType).Returns(stockList.ElementType);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.GetEnumerator()).Returns(stockList.GetEnumerator());
  dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);

this post 中的建议是将其标记为 virtual,但我不确定什么需要标记为虚拟?

错误发生在这一行:

  dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);

您尝试设置的 属性 或函数需要声明为

public virtual

否则 Moq 无法创建继承的 class,它会在您要设置时覆盖此函数或属性,这是必需的。

假设您使用的 EF 至少为 V6,并且基于此 example(查看博客元素),它正在做与您非常相似的事情。我猜你的问题是你的 dataAccess,无论它是什么,都没有将 Stocks 声明为虚拟的。

所以它应该看起来像这样:

public virtual DbSet<Stock> Stocks { get; set; }